漸漸的在 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 解晰完了怎麼辦
}
}
沒有留言:
張貼留言