【问题标题】:viewpager adapter null when activity recreated重新创建活动时,viewpager 适配器为空
【发布时间】:2014-11-17 20:31:05
【问题描述】:

我正在实现包含 viewpager 的 android 应用程序。问题是当应用程序在后台被杀死时,当我在 asynctask onPostExecute 方法中使用适配器实例设置我的 viewpager 时,我在线上有空指针。下面是我的代码。希望得到帮助:)

片段类中发生崩溃的片段

protected void onPostExecute(ArrayList<CategoryChild> result) {

            super.onPostExecute(result);

            if (this.fragmentWeakRef.get() != null) {

                if (result != null) {
                    mHomeCategories = result;

                    if(mBannerViewPager != null){
                    mBannerViewPager.setAdapter(new BannerViewpagerAdapter(
                            getChildFragmentManager(), getActivity()
                                    .getApplicationContext())); // here app crashes after being  killed in background
                                            //  and restored 

                    }
                    mcategoryViewPager.setAdapter(new CategoryViewpagerAdapter(
                            getChildFragmentManager(), getActivity()
                                    .getApplicationContext(),setFragmentsArray()));

                } else {
                    Toast.makeText(getActivity().getApplicationContext(),
                            "No Internet Connection", Toast.LENGTH_SHORT)
                            .show();
                }

            }
        }
    }   

这是我的适配器

public class BannerViewpagerAdapter extends FragmentPagerAdapter {

    private SparseArray<BannerFragment> registeredFragments = new SparseArray<BannerFragment>();
    private static HashMap<Integer, Integer> myHashmap = new HashMap<Integer, Integer>();

    static {
        myHashmap.put(0, R.drawable.img);
        myHashmap.put(1, R.drawable.stopex);
    }

    public BannerViewpagerAdapter(android.support.v4.app.FragmentManager fm, Context context) {
        super(fm);
        // TODO Auto-generated constructor stub
    }

    @Override
    public Fragment getItem(int position) {
        // TODO Auto-generated method stub
        BannerFragment myFragment = null;

        myFragment = registeredFragments.get(position);

            if(myFragment ==  null){
                myFragment = BannerFragment.newInstance(myHashmap.get(position));
                registeredFragments.put(position, myFragment);
            }


        return myFragment;
    }

    @Override
    public Object instantiateItem(ViewGroup arg0, int arg1) {
        // TODO Auto-generated method stub
        return super.instantiateItem(arg0, arg1);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 2;
    }

}

【问题讨论】:

    标签: android android-viewpager adapter


    【解决方案1】:

    这是合乎逻辑的。 Activity 被杀死,它的成员也被杀死。因此,在这种情况下,您应该解决应用程序的行为。您还可以添加一个验证您的 ViewPager 是否存在,就像您在上面所做的一些行一样:

    if (mcategoryViewPager != null) {
            mcategoryViewPager.setAdapter(new CategoryViewpagerAdapter(
                    getChildFragmentManager(), getActivity()
                          .getApplicationContext(),setFragmentsArray()))
    }
    

    哦。您的活动被杀死,因此 getActivity() 将返回 null。因此,只需在之前添加某处:

    if (getActivity() == null) { return; }
    

    【讨论】:

    • 应用在这一行崩溃 mBannerViewPager.setAdapter(newBannerViewpagerAdapter(getChildFragmentManager(), getActivity().getApplicationContext()));
    • 你说得对,我的朋友 getactivity() 为空。你真的帮了我谢谢:)
    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    相关资源
    最近更新 更多