Android ViewFinder

在Android獲取一個View通常都是經過以下方式:html

TextView textView = (TextView) findViewById(R.id.textview);

相信你們都寫過無數次findViewById了吧,每次都要Cast一下是否很不爽啊。今天就來介紹三種簡便的方法避免這種Castjava

第一種

在項目基類BaseActivity中添加以下函數:android

@SuppressWarnings(「unchecked」)
public final <E extends View> E getView (int id) {
    try {
        return (E) findViewById(id);
    } catch (ClassCastException ex) {
        Log.e(TAG, 「Could not cast View to concrete class.」, ex);
        throw ex;
    }
}

而後就能夠經過以下方式獲取View了:git

TextView textView = getView(R.id.textview);
Button button = getView(R.id.button);
ImageView image = getView(R.id.imageview);
注意:若是級聯調用getView 函數,則仍是須要Cast的,以下示例:
private static void myMethod (ImageView img) {
    //Do nothing
}
@Override
public void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myMethod(getView(R.id.imageview)); //這樣沒法經過編譯
    myMethod((ImageView) getView(R.id.imageview)); //須要Cast才能夠
}

第二種

第一種方法只在Activity裏有效,其實咱們常常在其餘View或者Fragment裏也經常使用findViewById方法,固然你能夠把上述方法copy一遍,可是這違反了面向對象基本的封裝原則,有大神封裝了一個ViewFinder類,具體代碼能夠見我Gist上的文件ViewFinder.java, 使用的時候你只須要在你的Activity或者View裏這樣使用:github

ViewFinder finder = new ViewFinder(this);
TextView textView = finder.find(R.id.textview);

第三種

前兩種方法本質上是利用了泛型,還有一種利用註解的方式,使用起來更方便,不只省事的處理了findViewById,甚至包括setOnClickListener這種方法也能很方便的調用,具體見我這篇博客ButterKnife--View注入框架框架

注意:若是你是使用的Eclipse引用該library,你須要參考這裏Eclipse Configuration作一些配置,不然會運行出錯。eclipse

相關文章
相關標籤/搜索