2011年7月2日 星期六

簡易的 interface 應用範例

最近有點覺得自己在 Android 專案中將 Broadcast 用過頭了…
漸漸的在 refactor 的過程將一些 Broadcast 以 interface 的方式替換掉…

在使用 Button、ScrollView 等元件時,時常會以此種方式獲得某些事件


public class MainActivity extends Activity implements View.OnClickListener
{
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView img = (ImageView)findViewById(R.id.information);
        img.setOnClickListener(this);
    }

    public void onClick(final View view)
    {
        if(view.equals(img))
        {
            // 此 ImageView 被按了一下嘍
        }
    }
}


到底像這種 Listener 是怎麼做的呢?靠得就是 interface
我們在類別中宣告 interface 並在使用該類別的類別中 implements
例如我需要一個元件讓我們丟入 html 就能漂漂亮亮顯示的 View
但又不想要用到複雜且功能比需要的多那麼多的 WebView
這時自行寫一個元件就得用上這種技巧了…
以下範例繼承一個 LinearLayout 並簡單的示範 interface 的使用…


public class SimpleWebView extends LinearLayout
{
    // 也許有一些 private ImageView、TextView 啥的,依需求而調整

    // 宣告一個儲存 Callback 指標的物件
    private onSimpleWebViewCommand mCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
   
    public void setContent(String htmlCode)
    {
        // 開始處理 html 並通知上層使用 SimpleWebView 的 class 看是要秀 Progress 還啥的
        if(mCallback != null)
        {
            mCallback.onPreParse();
        }

        // 將 html 中的圖片解晰出來貼在 ImageView 上 ...
        // 將需要變色變型的文字解晰出來貼在 TextView 上 ...

        // 通知上層使用 SimpleWebView 的 class 顯示完成把 Progress 關掉
        if(mCallback != null)
        {
            mCallback.onParseCompleted();
        }
    }

    public abstract interface onSimpleWebViewCommand
    {
        // 上層必須 implements 的 method 原型
        void onPreParse();
        void onParseCompleted();
    }

    public void setOnCommandListener(onSimpleWebViewCommand callback)
    {
        mCallback = callback;
    }
}


使用方法如下範例


public class MainActivity extends Activity implements SimpleWebView.onSimpleWebViewCommand
{
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        SimpleWebView swv = new SimpleWebView();
        swv.setOnCommandListener(this);
        swv.setContent("<image src=http://www.ascii.tw/aaa.jpg><font color=#333333>大家好 我叫 Ascii</font>");
    }

    public void onPreParse()
    {
        // swv 開始解晰 html 了怎麼辦
    }

    void onParseCompleted()
    {
        // swv 解晰完了怎麼辦
    }
}

沒有留言:

張貼留言