AndroidのButterKnife基本使用

7980 ワード

ButterKnife基本使用
ButterKnifeは基本的にButter Knife処理フィールドと方法でバインドする.
重要な更新:現在(2016.4.29)、ButterKnifeの最新バージョンは8.0.1.Demoプロジェクトが更新されました:https://github.com/mengdd/AndroidButterKnifeSample以下の原文はButterKnife v 6についてである.1.0の、v 8.0.1主な違いは以下のキーワードである.
@InjectView -> @BindView
@InjectViews -> @BindViews
ButterKnife.inject(this) -> ButterKnife.bind(this)


ButterKnife.reset(this) ->  

private Unbinder unbinder; 
unbinder = ButterKnife.bind(this, view); 
@Override
public void onDestroyView() {
    unbinder.unbind();
    super.onDestroyView();
}

構成:gradleで構成するときに追加:
compile 'com.jakewharton:butterknife:6.1.0'

注意Module:appのgradleファイルに追加する.加えてコマンドを実行する必要はなく、直接Syncを実行するとExternal Librariesにbutterknifeが表示されます.
機能1:findViewById()はもう書かない.以前の:
mTextView1 = (TextView) findViewById(R.id.butter_text_view_1);

まず、変数宣言時に注釈を付けることができます.
@InjectView(R.id.butter_text_view_2)
TextView mTextView2;

idが見つからない場合は、コンパイル時にエラーが発生します.
その後、レイアウト設定後にButterKnifeを呼び出す.inject():
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.demo_butter_knife);
 
    //using butter knife
    ButterKnife.inject(this);
}

その後、Viewオブジェクトが直接使用できるようになります.
注意が必要なのは、View変数宣言時にprivateまたはstaticではありません.Activityに加えて、オブジェクトを取得するために他のView Rootを提供することができます(注入を実行します).Adapter内のViewHolderを簡略化することもできます.
ButterKnife in FragmentではButterKnifeを使用してViewを取得することもできます.
public class SimpleFragment extends Fragment {
 
    @InjectView(R.id.fragment_text_view)
    TextView mTextView;
 
    public SimpleFragment() {
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_simple, container, false);
        ButterKnife.inject(this, view);
        mTextView.setText("TextView in Fragment are found!");
        return view;
    }
}

ButterKnife in Adapter ViewHolder Adapterには、findViewById()の繰り返し呼び出しを減らすためにViewHolderを使用する一般的な最適化戦略がある.以前に関連するブログを書いたことがあります.http://www.cnblogs.com/mengdd/p/3254323.html
ButterKnifeを使用すると、ViewHolderの使用は次のようになります.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.person_item_layout, null);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    Person person = getItem(position);
    if (null != person) {
        holder.name.setText(person.getName());
        holder.age.setText(String.valueOf(person.getAge()));
        holder.location.setText(person.getLocation());
        holder.work.setText(person.getWork());
    }

    return convertView;
}

static class ViewHolder {
    @InjectView(R.id.person_name)
    TextView name;
    @InjectView(R.id.person_age)
    TextView age;
    @InjectView(R.id.person_location)
    TextView location;
    @InjectView(R.id.person_work)
    TextView work;

    public ViewHolder(View view) {
        ButterKnife.inject(this, view);
    }
}

各フィールドを注釈でマークする、getView()メソッドでfindViewById()メソッドを呼び出す必要がなくなる、Viewクラスにパラメータ付きViewの構築方法が追加されていることがわかる.
機能2:setOnClickListener()を書く必要はありません.例えば、前の:
    finishButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });

次のように書くことができます.
    @OnClick(R.id.basic_finish_a_button)
    void finishA(View view) {
        finish();
    }

なお、ここでの方法はprivateやstaticではなく、パラメータViewを1つ持っていてもよいし、書かなくてもよい.すべてのlistenerのパラメータはoptionalで、書くことができて、書かないことができます.また、パラメータViewはButtonと書くことができ、ここのcastは自動的に完成する.
注意してください.ButterKnifeを呼び出す必要があります.inject(this); イベントバインドが成功しません.呼び出し忘れたinject(this);findViewではエラーが報告されますが、バインドイベントではエラーは報告されません.ただ、何も起こりません.
クリックイベント@OnClickのほか、ListViewのクリック@OnItemClick、CheckBoxの@OnCheckedChangedなどがあります.複数のIDを一度に指定し、複数のViewに対してイベント処理方法をバインドできます.たとえば、次のようにします.
//you can bind listener to multiple views
@OnClick({R.id.button_enable, R.id.button_disable, R.id.button_alpha_0, R.id.button_alpha_1})
void editViewsClicked() {
    Toast.makeText(this, "You click the Button!", Toast.LENGTH_SHORT).show();
} 

機能3:Viewリストを作成する:複数のViewを一緒に置くことで複数のViewを同時に取得でき、1つのリストに入れる:
@InjectViews({R.id.label_first_name, R.id.label_middle_name, R.id.label_last_name})
List labelViews;

@InjectViews({R.id.first_name, R.id.middle_name, R.id.last_name})
List nameViews; 

注意idはカンマで区切られ、括弧で囲まれ、外は括弧である.
apply()メソッドでは、オブジェクトのセットに値を一括して設定できます.apply()メソッドには、3つの形式があります.
public static  void apply(List list, Action super T> action)
public static  void apply(List list, Setter super T, V> setter, V value)
public static  void apply(List list, Property super T, V> setter, V value)

すなわちAction,Setter,Propertyの3種類である.ここで、ActionとSetterは共にButterKnifeのクラスである、継承し、自分のサブクラス実装を書き、それからオブジェクトに伝達する必要がある.Setterの3番目のパラメータはsetをどの値にするかを指定することができる.
PropertyはAndroidのクラスです.https://developer.android.com/reference/android/util/Property.html
具体的な使用例を参照してください.https://github.com/mengdd/AndroidButterKnifeSample/blob/master/app/src/main/java/com/example/mengdd/butterknifesample/ViewListActivity.javaその他の実用的な方法1.注入リセット(Injection Rest):ButterKnife注入のView参照をreset()メソッドでnullに設定することができる.例えばFragmentのonCreateView()でButterKnifeを呼び出します.Inject()メソッドはいくつかのViewを注入し、onDestroyView()でnullに設定したい場合はButterKnifeを直接呼び出すことができます.reset(this);方法
2.選択的注入(Optional Injection):デフォルトでは@InjectViewとlistenerの注入が必要であり、target viewが見つからない場合はエラーが報告される.このような行為を抑制するために,@Optional注釈でfieldとメソッドをマークし,注入を選択的にすることができ,targetViewが存在すると注入,存在しないと何事もしない.この@Optional注記は、レイアウトが多重化する場合に有用である.
3.マルチメソッドのlistener(Multi-method Listener):SpinnerのonItemSelectedListenerのような複数のコールバックメソッドを持つViewのlistenerがある:
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView> parent, View view, int position, long id) {
    }
 
    @Override
    public void onNothingSelected(AdapterView> parent) {
    }
});

メソッド注記は、これらのメソッドのいずれかにバインドするために使用することができる.各注釈にはデフォルトのcallbackがあり、どのメソッドにバインドされるかを指定します.callbackパラメータで特定の方法として指定することができる.たとえば、callbackは指定されておらず、デフォルトではonItemSelected()メソッドに対応しています.
@OnItemSelected(R.id.my_spinner)
    //default callback : ITEM_SELECTED
void onItemSelected(int position) {
    Toast.makeText(this, "position: " + position, Toast.LENGTH_SHORT).show();
}

callbackを指定し、onNothingSelected()メソッドに対応します.
@OnItemSelected(value = R.id.my_spinner, callback = OnItemSelected.Callback.NOTHING_SELECTED)
void onNothingSelected() {
    Toast.makeText(this, "Nothing", Toast.LENGTH_SHORT).show();
}

Spinnerではデータがある限り、デフォルトでは0番目のデータが選択されているので、onNothingSelected()メソッドに入るには、Adapterのデータをすべてクリアする必要があります.具体的な例は以下の通りです.https://github.com/mengdd/AndroidButterKnifeSample/blob/master/app/src/main/java/com/example/mengdd/butterknifesample/SpinnerActivity.java4.findById()メソッドButterKnife.findById()は、Activity、Dialog、またはViewのいずれかのViewを取得するために使用することができる.ButterKnifeは自動的にタイプ変換を完了するので、取得後は明示的な強転を行うことなく、具体的なViewタイプ参照に直接値を付与すればよい.
Resources: Sample Project: https://github.com/mengdd/AndroidButterKnifeSample
Introduction: http://jakewharton.github.io/butterknife/Java Doc: http://jakewharton.github.io/butterknife/javadoc/github: https://github.com/JakeWharton/butterknife