4

いくつかのビューがあり、それを 1 つの Fragment にバインドしたいと考えています。私は電話をかけButterKnife.Bind(this, view)ましたonCreateViewが、それは魅力のように機能します。

しかし、私が電話したときに例外に遭遇しましたButterKnife.Bind(this, view.findViewById(R.id.view2))。(きっとview.findViewById(R.id.view2) != null)

ButterKnife を介して 1 人の所有者に複数のビューを挿入できないのはなぜですか?

編集: 1 つのルート ViewGroup からビューをバインドできることはわかっています。私はこの状況にただ疑問を抱いていました。私の意見では、例外を発生させる理由はありませんが、ButterKnife が例外をスローしました。

4

2 に答える 2

1

ユースケースを知っておくと役立ちますが、ローカル変数にバインドされている 1 つのレイアウトからの複数のビューの例を次に示します。

public class FancyFragment extends Fragment {
  @Bind(R.id.button1) Button button1;
  @Bind(R.id.button2) Button button2;

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    ButterKnife.bind(this, view);
    // Use fields here or later in the lifecycle of the fragment
    return view;
  }
}

ルートとして 2 つの ViewGroup がある場合、結果がどうなるかを見るのは興味深いでしょう。@nullableそれぞれに追加し@BindてオプションのフィールドButterKnife.Bind(this, view2)にし、上記のバインド呼び出しの後に呼び出すことができます。それが見つからないビューを無効にするのか、それとも単に新しいビューをバインドするのかはわかりません。

于 2015-08-09T19:41:18.583 に答える
1

おそらく、ルート ViewGroup ではなく、2 つの子 View で ButterKnife.Bind() を呼び出そうとしていると思います。

紹介によると、子ビューごとに ButterKnife.Bind() を呼び出すのではなく、 @Bind アノテーションを使用してフィールドを宣言することにより、子ビューをフィールドにバインドする必要があります。

ButterKnife.Bind() は、ルートの ViewGroup オブジェクトでのみ呼び出す必要があります。このようにして、ButterKnife がビュー ID を検索するスコープを定義します。

ただし、2 つのルート ViewGroup で本当に ButterKnife.Bind() を呼び出したい場合は、ドキュメンテーションによると ButterKnife にはそのような使用法がないため、例外が発生するのは合理的です。実際には、各 Fragment/Activity クラスも 1 つのルート ViewGroup にのみ関連付ける必要があります。

于 2015-08-09T11:19:55.183 に答える