如何在没有 class 转换异常的情况下重构 findViewById?

How do I refactor findViewById without class cast exception?

通常当我的 android 应用程序中有很多元素时,onCreate 看起来像这样:

  onCreate(){

   ImageButton b1 = (ImageButton)findViewById(R.id.b1) ;
   ImageButton b2 = (ImageButton)findViewById(R.id.b2) ;
   ImageVuew v3 = (ImageButton)findViewById(R.id.v3) ;
   ViewSwitcher v4 = (ViewSwitcher)findViewbyId(R.id.v4) ;
   TextView v5 = (TextView)findViewById(R.id.v5) ;

   //and so on
  }

Android 需要为应用程序中的每个文本、图像、按钮等执行此 class 转换。但是文本、图像、按钮、切换器 都是 View class!

的子class

我尝试将所有视图添加到一组视图中并像这样循环:

  View[]clickableViews = {forkImageView, patronImageView,cabelImageView1,cabelImageView2, bulb_switcher,doublePlugImageView,kettleBaseImageView,kettleSwitcher} ;

    int []image_views_ids = {R.id.forkImage, R.id.patronImage, R.id.bulb_switcher, R.id.cabel1, R.id.cabel2, R.id.longcabel, R.id.kettle_base, R.id.kettleSwitcher};

    for( int i = 0 ; i < clickableViews.length;i++){
            clickableViews[i] = findViewById(image_views_ids[i]);
    }

可能会抛出class强制转换异常

有没有办法仍然聪明地做到这一点?

你应该投射到视图 class,to.

您的代码如下:

View[]clickableViews = {forkImageView, patronImageView,cabelImageView1,cabelImageView2, bulb_switcher,doublePlugImageView,kettleBaseImageView,kettleSwitcher} ;

        int []image_views_ids = {R.id.forkImage, R.id.patronImage, R.id.bulb_switcher, R.id.cabel1, R.id.cabel2, R.id.longcabel, R.id.kettle_base, R.id.kettleSwitcher};

        for( int i = 0 ; i < clickableViews.length;i++){
                clickableViews[i] =(View)findViewById(image_views_ids[i]);
        }

试试 library Butterknife,我想这就是您要找的。它会让你的代码更干净:)

网站上的例子是:

class ExampleActivity extends Activity {
  @InjectView(R.id.title) TextView title;
  @InjectView(R.id.subtitle) TextView subtitle;
  @InjectView(R.id.footer) TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.inject(this);
    // TODO Use "injected" views...
  }
}