butterknife

3886 ワード

TextView titleにR.id.titleを割り当てるには、次のようにします.
TextView title;
...
@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    title = (TextView)activity.findViewById(R.id.title);
    // TODO Use fields...
}
ただしButterKnifeを使用すると、以下のように使用できます.
@BindView(R.id.title) TextView title;
...
@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields...
}
Advantage
コントロールオブジェクトやresourceなどを一貫した方法で使用できます
不要なテンプレートを取り除くことができます
論理を定義と宣言から分離することができ、論理の実現と分析を容易にすることができます.
Gradleに宣言:
dependencies {
    ...
    compile 'com.jakewharton:butterknife:8.6.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0'
}
使用例は次のとおりです.
public class BasicWithButterKnifeActivity extends AppCompatActivity {

    @BindView(R.id.text_change_view)
    TextView changeView;

    @BindString(R.string.str_basic)
    String strChanged;

    @BindColor(R.color.colorBasicChanged)
    int colorChanged;

    @OnClick(R.id.button_change_text)
    void changeText() {
        changeView.setText(strChanged);
    }

    @OnClick(R.id.button_change_color)
    void changeColor() {
        changeView.setBackgroundColor(colorChanged);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic);

        ButterKnife.bind(this);
    }
}
分割使用(サンプルコード)
注釈を使用してControls、resources、event callbackを定義し、コンストラクション関数はButterKnifeを使用します.bind(Object, View); 呼び出し.
実際に使用するアクティビティとライフサイクルが異なるため、バインドされたオブジェクトを適切な場所でnullに設定する必要があります.このためbindポイントでUnbinderに戻って処理することができる.onCreateViewでは、通常、Bind解雇onDestroyViewでバインドを解除します.
public class FragmentB extends Fragment {

    @BindView(R.id.txt_description)
    TextView description;
    @BindView(R.id.img_view)
    ImageView image;
    @BindString(R.string.str_frag_b)
    String strDescription;
    @BindDrawable(android.R.drawable.star_big_on)
    Drawable drawable;

    private Unbinder unbinder;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_fragment, container, false);

        unbinder = ButterKnife.bind(this, view);
        description.setText(strDescription);
        image.setImageDrawable(drawable);

        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
}
ViewHolderでの使用(サンプルコード)
注釈を使用してControls、resources、event callbackを定義し、コンストラクション関数はButterKnifeを使用します.bind(Object, View); 呼び出し.
例では、getItemを使用して@OnClick関数にitemをインポートします.clickButton()はメソッド定義のように見えますが、実際にはsetOnClickListenerを使用してR.id.btn itemとして宣言されたButtonビューに追加されたリスナーオブジェクトに関連付けられています.だから内部ではgetItemではなくthisitemで使用している場合は、classが最初に作成されたときにButterKnifeが使用されます.bind()を呼び出すとnullの値が呼び出されます.したがって、getItem()のように関数に接続して、後で入力する値を取得する必要があります.
class RecyclerWithButterKnifeViewHolder extends RecyclerView.ViewHolder {
    @BindView(R.id.txt_item)
    TextView text;
    String item;

    RecyclerWithButterKnifeViewHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }

    void bind(final String item) {
        this.item = item;
    }

    @OnClick(R.id.btn_item)
    void clickButton() {
        text.setText(getItem());
    }

    private String getItem() {
        return this.item;
    }
}