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(); //=> ??? }
もっと早く使っとけば良かった。もしくはもっといい方法があれば知りたい。