Android 在一个片段中使用具有2个不同视图的ButterKnife库

Android 在一个片段中使用具有2个不同视图的ButterKnife库,android,android-fragments,butterknife,Android,Android Fragments,Butterknife,我目前正在尝试使用Android的ButterKnife库来处理一些样板代码() 我已将其设置好,并使其处于半工作状态,但我遇到了一个无法解决的问题:/ 我有一个片段,其中包含一个ListView元素,我在这个ListView中附加了一个包含多个元素的页脚视图 这是使用库从我的片段中提取的代码片段: public class UsersFragment extends Fragment { @InjectView(R.id.users_listview_id) AutoUpdatingL

我目前正在尝试使用Android的ButterKnife库来处理一些样板代码()

我已将其设置好,并使其处于半工作状态,但我遇到了一个无法解决的问题:/

我有一个片段,其中包含一个ListView元素,我在这个ListView中附加了一个包含多个元素的页脚视图

这是使用库从我的片段中提取的代码片段:

public class UsersFragment extends Fragment {
    @InjectView(R.id.users_listview_id) AutoUpdatingListView list;

    private View footerView;
    @InjectView(R.id.add_user_footer_firstname_edittext_id) BootstrapEditText firstnameEditText;
    @InjectView(R.id.add_user_footer_middlename_edittext_id) BootstrapEditText middlenameEditText;
    @InjectView(R.id.add_user_footer_lastname_edittext_id) BootstrapEditText lastnameEditText;
    @InjectView(R.id.add_user_footer_cancel_button_id) BootstrapButton cancelButton;
    @InjectView(R.id.add_user_footer_okay_button_id) BootstrapButton okayButton;
    @InjectView(R.id.add_user_footer_facebook_button) BootstrapCircleThumbnail facebookButton;
    @InjectView(R.id.add_user_footer_google_plus_button) BootstrapCircleThumbnail googlePlusButton;
    @InjectView(R.id.add_user_footer_twitter_button) BootstrapCircleThumbnail twitterButton;
    @InjectView(R.id.add_user_footer_linkedin_button) BootstrapCircleThumbnail linkedInButton;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.user_fragment, container, false);
    footerView = ((LayoutInflater) getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.add_user_footer_view, null, false);

    ButterKnife.inject(this, rootView);

    list.setAdapter(adapter);
    }
}
上面的代码不起作用,因为我只能使用1个视图进行注入,如果我尝试使用这两个视图(2x个注入),第二个注入将覆盖第一个注入,留下空值

我似乎无法像使用常规findViewById()一样指定哪个视图包含哪些元素

为了澄清,这是我的非巴特刀代码(100%):

如上所示,我可以指定“rootView”或“footerView”作为findViewById的目标


有人能帮忙解决这个问题吗?现在我快发疯了。

简单的解决方案是将所有页脚视图放在一个视图持有者类中,然后在不同的对象上执行注入,同时保持页脚视图在片段中易于访问

@InjectView(R.id.users_listview_id) AutoUpdatingListView list;

private View footerView;
public class FooterViewHolder {
    @InjectView(R.id.add_user_footer_firstname_edittext_id) BootstrapEditText firstnameEditText;
    @InjectView(R.id.add_user_footer_middlename_edittext_id) BootstrapEditText middlenameEditText;
    @InjectView(R.id.add_user_footer_lastname_edittext_id) BootstrapEditText lastnameEditText;
    @InjectView(R.id.add_user_footer_cancel_button_id) BootstrapButton cancelButton;
    @InjectView(R.id.add_user_footer_okay_button_id) BootstrapButton okayButton;
    @InjectView(R.id.add_user_footer_facebook_button) BootstrapCircleThumbnail facebookButton;
    @InjectView(R.id.add_user_footer_google_plus_button) BootstrapCircleThumbnail googlePlusButton;
    @InjectView(R.id.add_user_footer_twitter_button) BootstrapCircleThumbnail twitterButton;
    @InjectView(R.id.add_user_footer_linkedin_button) BootstrapCircleThumbnail linkedInButton;

}
private FooterViewHolder footerViewHolder;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.user_fragment, container, false);
    footerView = inflater.inflate(R.layout.add_user_footer_view, container, false);
    footerViewHolder = new FooterViewHolder();

    ButterKnife.inject(this, rootView);
    ButterKnife.inject(footerViewHolder, footerView);

    list.setAdapter(adapter);

    return rootView;
}

顺便说一句,这是用空的父视图膨胀视图。

太棒了!几乎可以通过复制代码来工作,尽管它有两个小错误。1) ButterKnife不允许在私有类中使用@InjectView,因此必须将其公开以便编译2)我必须将'null'作为footerView的根传递,否则我会得到一个“java.lang.ClassCastException:android.widget.FrameLayout$LayoutParams不能强制转换为android.widget.AblistView$LayoutParams”异常非常感谢您的帮助,比我预期的要简单得多:)@Kasper这是一个非常糟糕的做法,foot将在listview中,因此在本例中,它应该作为容器获取,然后如何在footerViewHolder的一个视图上设置say“@OnClick”方法?或者这已经不可能了?我编写了上面的代码,但无法用'@OnClick'注释视图,因为找不到它。@AutoM8R关于实现OnClick方法的任何想法。
@InjectView(R.id.users_listview_id) AutoUpdatingListView list;

private View footerView;
public class FooterViewHolder {
    @InjectView(R.id.add_user_footer_firstname_edittext_id) BootstrapEditText firstnameEditText;
    @InjectView(R.id.add_user_footer_middlename_edittext_id) BootstrapEditText middlenameEditText;
    @InjectView(R.id.add_user_footer_lastname_edittext_id) BootstrapEditText lastnameEditText;
    @InjectView(R.id.add_user_footer_cancel_button_id) BootstrapButton cancelButton;
    @InjectView(R.id.add_user_footer_okay_button_id) BootstrapButton okayButton;
    @InjectView(R.id.add_user_footer_facebook_button) BootstrapCircleThumbnail facebookButton;
    @InjectView(R.id.add_user_footer_google_plus_button) BootstrapCircleThumbnail googlePlusButton;
    @InjectView(R.id.add_user_footer_twitter_button) BootstrapCircleThumbnail twitterButton;
    @InjectView(R.id.add_user_footer_linkedin_button) BootstrapCircleThumbnail linkedInButton;

}
private FooterViewHolder footerViewHolder;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.user_fragment, container, false);
    footerView = inflater.inflate(R.layout.add_user_footer_view, container, false);
    footerViewHolder = new FooterViewHolder();

    ButterKnife.inject(this, rootView);
    ButterKnife.inject(footerViewHolder, footerView);

    list.setAdapter(adapter);

    return rootView;
}