为什么不能将多个视图绑定到一个所有者?

时间:2015-08-09 09:24:28

标签: android butterknife

我有一些观点,我想将它绑定到一个片段。 我在ButterKnife.Bind(this, view)中拨打了onCreateView,它就像一个魅力。

但是当我打电话给ButterKnife.Bind(this, view.findViewById(R.id.view2))时我遇到了异常。 (当然view.findViewById(R.id.view2) != null

为什么我不能通过ButterKnife向一个所有者注入多个视图?

编辑: 我知道我可以从一个根ViewGroup绑定视图。我对这种情况只是怀疑。在我看来,没有理由引起异常但ButterKnife却抛出异常。

2 个答案:

答案 0 :(得分:1)

我想也许你试图在两个子View上调用ButterKnife.Bind(),而不是根ViewGroup。

根据介绍,您应该通过使用@Bind注释声明字段来绑定任何子视图,但是通过为每个子视图调用ButterKnife.Bind()来

只应在根ViewGroup对象上调用ButterKnife.Bind()。通过这种方式,它定义了ButterKnife将搜索视图ID的范围。

但是,如果你真的想在两个根ViewGroup上调用ButterKnife.Bind(),那么发生异常是合理的,因为根据文档,ButterKnife没有这样的用法。实际上你应该让每个Fragment / Activity类只与一个根ViewGroup相关。

答案 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;
  }
}

如果您有两个ViewGroup作为根,那么看看结果会很有趣。您可以为每个@nullable添加@Bind以使其成为可选字段,然后在上述绑定调用后调用ButterKnife.Bind(this, view2)。我不知道这是否会使未完成的视图无效或只是绑定新视图。