読者です 読者をやめる 読者になる 読者になる

パルカワ2

PerlとRubyとイチャラブ

ButterKnifeのView lists便利

AndroidアプリのViewのXMLは、平べったくなるように書いてる。
今までは、ある条件を満たす時にはAとBとCを消して、満たさない時はAとBとCを表示するみたいな事をやりたい時に全部のViewを指定していた。

そうすると後で何かViewを追加した時にどちらかの方では変更し忘れるとか起きうる。変化に弱い。

@BindView(R.id.hoge_name)
View hogeNameView;

@BindView(R.id.hoge_address)
View hogeAddressView;

@BindView(R.id.hoge_tel)
View hogeTelView;

void onCreate() {
  ...
  ButterKnife.bind(this);
  ...
}

public void hideHoge() {
  hogeNameView.setVisibility(View.GONE);
  hogeAddressView.setVisibility(View.GONE);
  hogeTelView.setVisibility(View.GONE);
}

public void showHoge() {
  hogeNameView.setVisibility(View.VISIBLE);
  hogeAddressView.setVisibility(View.VISIBLE);
  hogeTelView.setVisibility(View.VISIBLE);
}

ButterKnifeのview listsを使うとこう書ける。ひとまとめに出来るので、変更が起きた時も変更しやすい。

@BindViews({
  R.id.hoge_name,
  R.id.hoge_address,
  R.id.hoge_tel
})
List<View> hogeViews;

void onCreate() {
  ...
  ButterKnife.bind(this);
  ...
}

public void hideHoge() {
  ButterKnife.apply(hogeViews, new ButterKnife.Action<View>() {
    @Override public void apply(View view, int index) {
      view.setVisibility(View.GONE);
    }
  });
}

public void showHoge() {
  ButterKnife.apply(hogeViews, new ButterKnife.Action<View>() {
    @Override public void apply(View view, int index) {
      view.setVisibility(View.VISIBLE);
    }
  });
}

ただこのブログを書いてる時に以下のようなコードを書いた場合、値はどうなるんだろうなぁと思った。確かめてはないけど、VISIBLEのままだとハマったりしそう。

@BindView(R.id.hoge_name)
TextView hogeNameView;

@BindViews({
  R.id.hoge_name,
  R.id.hoge_address,
  R.id.hoge_tel
})
List<View> hogeViews;

onCreate() {
  hogeNameView.setVisibility(View.VISIBLE);

  ButterKnife.apply(hogeViews, new ButterKnife.Action<View>() {
    @Override public void apply(View view, int index) {
      view.setVisibility(View.GONE);
    }
  });

  hogeNameView.getVisibility();  //=> ???
}

もっと早く使っとけば良かった。もしくはもっといい方法があれば知りたい。