Как я могу рефакторинг findViewById без исключения приведения класса?

Обычно, когда у меня много элементов в моем приложении для 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 требует выполнять приведение этого класса для каждого текста, изображения, кнопки и т. Д. В приложении. Но текст, изображение, кнопка, переключатель - это все подклассы класса View!

Я пытаюсь добавить все представления в один массив представлений и перебрать их так:

  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]);
    }

Может вызвать исключение приведения класса

Есть ли способ все-таки сделать это умным способом?

2 ответа

Решение

Попробуйте библиотеку 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...
  }
}

Вы также должны привести в класс View.

Ваш код будет выглядеть так:

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]);
        }
Другие вопросы по тегам