在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