FragmentTabhost和viewPager一起使用会出现的小bug及解决方案

  • 前段时间开发的时候将一个FragmentTabhost 加入到viewPager中,滑动viewPager再次返回之前FragmentTabhost会出现空指针,会出现java.lang.NullPointerException, 是在FragmentState.instantiate 出错。
    为什么会出现这个异常?怎么解决?

  • 回答: 第一次加载viewPager不会出错,第二次就会出现以上情况,是在FragmentState.instantiate这里 出的错。

  • 解决办法如下:
    可以在构造的时候传递一个ArrayList list,再通过getItem 返回即可
    (注:TabsInfo是关键,在getItem方法中需要使用Fragment.instantiate得到一个Fragment)
    【题外话,常用的组合ViewPager + fragment 不会出现以上所说的异常。】

  • 附上代码讲解:

import java.util.ArrayList;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentStatePagerAdapter;


//************************自定义pagerAdapter**********************
public class MviewPagerAdapter extends FragmentStatePagerAdapter{

    private final ArrayList<TabsInfo> lstTabsInfo;
    private final Context mContext;
    public static class TabsInfo {
        private final Class<?> clss_;
        private final Bundle args_;
        public TabsInfo(Class<?> clss, Bundle args) {
            this.clss_ = clss;
            this.args_ = args;
        }
    }
    public MviewPagerAdapter(FragmentActivity activity, ArrayList<TabsInfo> lstTabsInfo) {
        super(activity.getSupportFragmentManager());
        mContext = activity;
        this.lstTabsInfo = lstTabsInfo;
    }

    @Override
    public Fragment getItem(int position) {
        // TODO Auto-generated method stub
        TabsInfo info = lstTabsInfo.get(position);
        return Fragment.instantiate(mContext, info.clss_.getName(), info.args_);
    }

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

//*******************应用************************
public class MainActivity extends FragmentActivity implements OnPageChangeListener, OnCheckedChangeListener{
    private RadioGroup mRadioGroup;
    private ViewPager mViewPager;
    private ArrayList<Integer> lstCheckIds;
    private ArrayList<TabsInfo> lstTabsInfos;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRadioGroup = (RadioGroup)findViewById(R.id.radiogroup);
        mRadioGroup.check(R.id.chengzai);
        lstCheckIds = new ArrayList<Integer>();
        for(int i=0; i<5; i++) {
            lstCheckIds.add(R.id.chengzai+i);
        }
        mRadioGroup.setOnCheckedChangeListener(this);
        mViewPager = (ViewPager)findViewById(R.id.main_viewPager);
        lstTabsInfos = new ArrayList<TabsInfo>();
        //**********此处为关键代码*************
        lstTabsInfos.add(new TabsInfo(FireDisasterFragment.class, null));
        lstTabsInfos.add(new TabsInfo(SuperviseFragment.class, null));
        lstTabsInfos.add(new TabsInfo(Tab1.class, null));
        lstTabsInfos.add(new TabsInfo(Tab2.class, null));
        lstTabsInfos.add(new TabsInfo(Tab1.class, null));
        MviewPagerAdapter adapter = new MviewPagerAdapter(this, lstTabsInfos);
        mViewPager.setAdapter(adapter);
        mViewPager.setCurrentItem(0);
        mViewPager.setOnPageChangeListener(this);
    }

    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        // TODO Auto-generated method stub
        for(int i=0; i<lstCheckIds.size(); i++) {
            if(lstCheckIds.get(i) == checkedId) {
                mViewPager.setCurrentItem(i);
                break;
            }
        }
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onPageSelected(int position) {
        // TODO Auto-generated method stub
        mRadioGroup.check(lstCheckIds.get(position));
    }

}

//*********另附上 FireDisasterFragment(FragmentTabhost)关键代码**************
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        Log.e("fire_oncreateview", "oncreateview");

        View view = (View)inflater.inflate(R.layout.firedisaste_layout, container, false);
        mTabHost = (FragmentTabHost)view.findViewById(android.R.id.tabhost);
        mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent);
        View indicator = (View)inflater.inflate(R.layout.tabwidgets_layout, null);
        TextView textView = (TextView)indicator.findViewById(R.id.tabwidget_indicator);

        textView.setText("tabwidget1");
        mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator(indicator), Tab3.class, null);

        View indicator1 = (View)inflater.inflate(R.layout.tabwidgets_layout, null);
        TextView textView2 = (TextView)indicator1.findViewById(R.id.tabwidget_indicator);
        textView2.setText("tabwidget2");
        mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator(indicator1), Tab4.class, null);
        return view;
    }

//*********************布局代码***************************
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.app.FragmentTabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@+id/realtabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>

    </LinearLayout>
</android.support.v4.app.FragmentTabHost>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AWeiLoveAndroid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值