Android ViewPager获取 View 空指针异常

标签 android android-fragments android-viewpager android-fragmentactivity fragmentstatepageradapter

我有 support.v4 ViewPager,我使用 FragmentStatePagerAdapter 填充了 fragment 。

ViewPager 中 fragment 的显示按预期工作,但问题是在调用 FragmentActvitiy 类中的 getView() 函数时获取 fragment View 。我可以访问所有 15 个 fragment 并获取参数等......,但是当在 fragment 上调用 ​​getView() 函数时,我得到一个 空指针异常,因为第三个 fragment getView() 是 null.

MyPageAdapter adapter = (MyPageAdapter) pager.getAdapter();
Fragment fragment;

for (int i=0; i<15; i++) {
    fragment = adapter.getItem(i);
    View v = fragment.getView();
    System.out.println("--- FRAGMENT = " + fragment + "   VIEW = " + v);
}

输出:

--- FRAGMENT = MyPrvaPomocFragment{40ede4c8 #0 id=0x7f06000d}   VIEW = android.support.v4.app.NoSaveStateFrameLayout{40f11cb0 V.E..... ......I. 0,0-540,850}
--- FRAGMENT = MyPrvaPomocFragment{40edf7c0 #1 id=0x7f06000d}   VIEW = android.support.v4.app.NoSaveStateFrameLayout{40f16f80 V.E..... ......ID 540,0-1080,850}
--- FRAGMENT = MyPrvaPomocFragment{40ee0998}   VIEW = null

FragmentStatePageAdapter类代码:

public class MyPageAdapter extends FragmentStatePagerAdapter {

    private List<Fragment> fragments;

    public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int position) {
        return this.fragments.get(position);
    }

    @Override
    public int getCount() {
        return this.fragments.size();
    }

    @Override
    public int getItemPosition(Object object){
        return PagerAdapter.POSITION_NONE;
    }
}

fragment 类代码:

public class MyPrvaPomocFragment extends Fragment {

    public static final String EXTRA_QUESTION_NUMBER = "EXTRA_QUESTION_NUMBER";
    public static final String EXTRA_QUESTION = "EXTRA_QUESTION";
    ...    

    public static final MyPrvaPomocFragment newInstance(String questionNumber, String question, ..., int correctAnswer) {
        MyPrvaPomocFragment f = new MyPrvaPomocFragment();

        Bundle bdl = new Bundle(1);
        bdl.putString(EXTRA_QUESTION_NUMBER, questionNumber);
        bdl.putString(EXTRA_QUESTION, question);
        bdl.putInt(EXTRA_CORRECT_ANSWER, correctAnswer);
        ...
        f.setArguments(bdl);

        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String question = getArguments().getString(EXTRA_QUESTION);
        String firstAnswer = getArguments().getString(EXTRA_FIRST_ANSWER);
        ...

        View v = inflater.inflate(R.layout.fragment_prva_pomoc, container, false);

        TextView textViewQuestion = (TextView) v.findViewById(R.id.textViewQuestion);
        CheckBox checkBox1 = (CheckBox) v.findViewById(R.id.checkBox1);
        CheckBox checkBox2 = (CheckBox) v.findViewById(R.id.checkBox2);
        ...

        textViewQuestion.setText(question);
        checkBox1.setText(firstAnswer);
        checkBox2.setText(secondAnswer);

        return v;
    }
}

FragmentActivity类代码:

public class KvizPrvaPomoc extends FragmentActivity {

    ViewPager pager;
    MyPageAdapter pageAdapter;    

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.kviz_prva_pomoc);

        pager = (ViewPager)findViewById(R.id.viewpagerquiz);              
        pageAdapter = new MyPageAdapter(getSupportFragmentManager(), getFragments());
        pager.setAdapter(pageAdapter);
    }  

    private List<Fragment> getFragments(){
        String question;
        String firstAnswer;
        String secondAnswer;
        ...

        List<Fragment> fragmentList  = new ArrayList<Fragment>();

        for (int j=0; j<someList.size(); j++)  { 
            ...  
            fragmentList.add(MyPrvaPomocFragment.newInstance(questionNumber, question, firstAnswer, ...));
        }

        return fragmentList;
    }
}

我已经阅读了大量的问题/答案,但我不知道可能出了什么问题。

最佳答案

这是预期的行为;一旦您向任一方向滚动多个 fragment 远离 fragment ,FragmentStatePagerAdapter 就会销毁 fragment 。这样做是为了节省内存。

关于Android ViewPager获取 View 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20892074/

相关文章:

android - 如何使用 Activity 和 Fragment 之间的接口(interface)双向发送数据

android - ViewPager 内的 TabLayout 禁止滑动

java - 以编程方式添加的 View 寻呼机不显示

java - 如何使用 Facebook SDK android 获取 Facebook 照片、全名、性别

android - 公共(public)或私有(private),Android变量真的很重要吗

java - Android Studio 服务器连接失败

android - 如何连接多个 recyclerview 或 fragment 以显示动画

android - 如何在 `react-native`中检查Android设备是否支持手电筒?

android - fragment 替换事务不记住可变位图的状态

android - 检测 ViewPager 上的 View 更改