【问题标题】:FragmentStatePagerAdapter is not calling getItem()FragmentStatePagerAdapter 没有调用 getItem()
【发布时间】:2017-08-13 18:17:19
【问题描述】:

我已经看到了我的问题的相关帖子,但这并不能解决我的问题。 我正在尝试使用 3 个片段获得滑动视图。 在主要片段中我有这个:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View vue = inflater.inflate(R.layout.fragment_conversions, container, false);

    ConversionsPagerAdapter cPageAdapter = new ConversionsPagerAdapter(getActivity().getSupportFragmentManager());
    ViewPager vp = vue.findViewById(R.id.conversionsPager);
    cPageAdapter.getItem(0);
    vp.setAdapter(cPageAdapter);


   Button convKmhKts = (Button) vue.findViewById(R.id.convKmhKts);
   convKmhKts.setText("...");
...

这是我的 FragmentStatePagerAdapter 的类:

public class ConversionsPagerAdapter extends FragmentStatePagerAdapter{
    public ConversionsPagerAdapter(FragmentManager fm) {
        super(fm);
        Log.i("ARKA", "FragmentStatePagerAdapter CONSTRUCTOR");
    }

    @Override
    public Fragment getItem(int i) {
        return ConversionFragment.newInstance(i);
    }

    @Override
    public int getCount() {
        return 1;
    }
}

最后是显示 Tab 的 Fragment:

public class ConversionFragment extends Fragment {
    public static final String ID_CONVERSION = "id_conversion";

    public static ConversionFragment newInstance(int pos) {
        ConversionFragment stf = new ConversionFragment();
        Bundle args = new Bundle();
        args.putInt("pos", pos);
        stf.setArguments(args);
        return stf;
    }


    public ConversionFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        // The last two arguments ensure LayoutParams are inflated
        // properly.

        Bundle args = getArguments();
        int idConversion = args.getInt(ID_CONVERSION);
        Log.i("idConversion", String.valueOf(idConversion));
        int idVue;

        switch (idConversion){
            case 0: idVue = R.layout.fragment_conversions_vitesse;
                break;
            case 1: idVue = R.layout.fragment_conversions_vitesse;
            default: idVue = R.layout.fragment_conversions_vitesse;
                break;
        }

        View rootView = inflater.inflate(idVue, null);
        return rootView;
    }
}

事实上,永远不会调用 getItem()。 我尝试通过 getChildFragmentManager() 更改 getActivity().getSupportFragmentManager(),但似乎这不是好方法... 当我尝试访问我的按钮时,我得到了这个:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)”

在我使用按钮的那一行。

【问题讨论】:

    标签: android fragmentstatepageradapter


    【解决方案1】:

    如果你在 Fragment 中使用 ViewPager,你必须使用 chield 片段管理器,所以尝试用 getChildFragmentManager() 替换 getActivity().getSupportFragmentManager()。如果你对所有东西都使用一个片段管理器,它会给你带来一些错误。

    For more information

    【讨论】:

    • 感谢您的回答。我已经尝试过了,但我遇到了同样的问题:ChildManager 出现空指针异常...
    【解决方案2】:

    你在这里做错了

    cPageAdapter.getItem(0);
    vp.setAdapter(cPageAdapter);
    

    设置adapter先查看pager,然后尝试调用get item方法。

    vp.setAdapter(cPageAdapter);
    cPageAdapter.getItem(0);
    

    【讨论】:

    • 您好,感谢您的回答,这只是为了测试,我忘记修改此行,但我会尝试您的 idera。
    【解决方案3】:

    好的, 问题是我尝试访问一个未充气的组件:

    convKmhKts.setText("...");
    

    我在子片段中访问它,现在没问题....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多