【问题标题】:Butterknife view in Fragment is null reference if call from parent activity如果从父活动调用,Fragment 中的 Butterknife 视图为空引用
【发布时间】:2016-01-20 02:04:44
【问题描述】:

我在使用 Butterknife libray 时遇到问题。我在 FragmentSearchAdapter 中有 SearchActivity.class 使用 ViewPager 和 3 个 Fragment:

SearchActivity.class

mAdapter = new FragmentSearchAdapter(getSupportFragmentManager(), SearchActivity.this);
    mAdapter.addFragment("search histori");
    mAdapter.addFragment("search query");
    mAdapter.addFragment("search result");
        mPager.setAdapter(mAdapter);

    mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        public void onPageSelected(int currentIndex) {
            if(currentIndex==2) {
                SearchResultFragment SearchResultFragment = (SearchResultFragment) mAdapter.getItem(2);

                if (SearchResultFragment != null) {
                    SearchResultFragment.setDescription("Text 1","Text 2");
                }
          }
        }

        public void onPageScrolled(int arg0, float arg1, int arg2) { }

        public void onPageScrollStateChanged(int arg0) { }
    });

FragmentSearchAdapter.class

 @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                SearchHistoryFragment search_histori = new SearchHistoryFragment();
                return search_histori;
            case 1:
                SearchQueryFragment search_query = new SearchQueryFragment();
                return search_query;
            case 2:
                SearchResultFragment search_result =  new SearchResultFragment();
                return search_result;
        }
        return null;
    }

其中一个片段是SearchResultFragment.Class

public class SearchResultFragment extends Fragment {

    @Bind(R.id.text1)
    TextView text1;
    @Bind(R.id.text2)
    TextView text2;
    private String page_index;
    private PageAlquranActivity activity;

    public SearchResultFragment() {
    }

    public static SearchResultFragment newInstance(int page_index) {
        SearchResultFragment fragment = new SearchResultFragment();
        Bundle args = new Bundle();
        args.putString(Variabel.page_index, String.valueOf(page_index));
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            page_index = getArguments().getString(Variabel.page_index);
        }
        activity = (PageAlquranActivity) getActivity();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_search_result, container, false);
        ButterKnife.bind(this, v);
        return v;
    }

    public void setDescription(String s1, String s2) {
        text1.setText(s1);
        text2.setText(s2);
    }

    @Override
    public void onAttach(Context context) {super.onAttach(context);}

    @Override
    public void onDetach() {
        super.onDetach();
    }

}

我的问题:当从 SearchActivity 调用方法 SearchResultFragment.setDescription("Text 1","Text 2"); 时,我得到错误:

空对象引用

每个文本视图。如果使用 ButterKnife,则会出现此错误,但如果没有,如果我这样声明 View 就可以了:

text1 = rootView.findViewById(R.id.text1);
text2 = rootView.findViewById(R.id.text2);

在 onCreateView 中。

那么如何解决呢?对不起我的英语不好。谢谢。

【问题讨论】:

  • 您是否尝试在 @Bind 之前添加 @Nullable 注释?
  • 我遇到了类似的问题(页面更改后,某个片段的每个注入视图都变为空)。 你找到解决办法了吗?

标签: android android-fragments butterknife


【解决方案1】:

@AmayDiam 你需要在被调用的方法中再次绑定 ButterKnife。传递绑定的依赖项——来自 OnPageChangeListener 的片段视图

SearchActivity.class

mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
public void onPageSelected(int currentIndex) 
{
    if(currentIndex==2) 
    {
        SearchResultFragment SearchResultFragment = (SearchResultFragment) mAdapter.getItem(2);

        if (SearchResultFragment != null) 
        {
            SearchResultFragment.setDescription(mPager.getChildAt(currentIndex)"Text 1","Text 2");
        }
      }
    }

    public void onPageScrolled(int arg0, float arg1, int arg2) { }

    public void onPageScrollStateChanged(int arg0) { }
});

SearchResultFragment.Class

public void setDescription(View view,String s1, String s2) 
{
    ButterKnife.bind(this, view);
    //
    text1.setText(s1);
    text2.setText(s2);
}

【讨论】:

    【解决方案2】:

    也有类似的问题,只是因为我从 Android Studio 的依赖管理中添加了黄油刀,而不是通过从黄油刀网站复制粘贴 gradle 行。 所以我不得不添加 compile 'com.jakewharton:butterknife:8.5.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' 而不仅仅是 compile 'com.jakewharton:butterknife:8.5.1'

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2020-01-13
      相关资源
      最近更新 更多