Fragment 生命周期及搭配ViewPader+TabLayout

1、定义Fragment 数组,存储要使用的所有Fragment

private Fragment[] mFragments;
mFragments = new Fragment[4];
mFragments[0] = new Fragment1();
mFragments[1] = new Fragment2();
mFragments[2] = new Fragment3();
mFragments[3] = new Fragment4();

2、设置默认显示的Fragment

FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.fl_show, mFragments[0]);
        transaction.commit();

3、隐藏和显示

public void switchContentWeb(Fragment from, Fragment to) {
        if (from != to) {
            mContent = to;
            FragmentTransaction transaction = manager.beginTransaction();
            //            .setCustomAnimations(
            //                    android.R.anim.fade_in, android.R.anim.fade_out);

            if (!to.isAdded()) {    // 先判断是否被add过
                transaction.hide(from).add(R.id.fl_show, to).commit(); // 隐藏当前的fragment,add下一个到Activity中
            } else {
                transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
            }
        }
    }

TabLayout + ViewPager + Fragment
Fragment内嵌套包含ViewPager以及多个Fragment
1、定义定义Fragment 数组,存储ViewPager 要使用的所有Fragment

private List<Fragment> fragmentList = new ArrayList<>();
Bundle bundle = new Bundle();
                    bundle.putSerializable(“argument”, TabListBean);
                    bundle.putInt("pos",i);
                    WebFragment webFragment = new WebFragment();
                    webFragment.setArguments(bundle);
                    fragmentList.add(webFragment);
adapter = new AmusementFragmentAdapter(getChildFragmentManager(), fragmentList, tabList);
viewPager.setAdapter(adapter);
//懒加载
viewPager.setOffscreenPageLimit(tabList.size() - 1);
//tabLayout关联viewPager
tabLayout.setupWithViewPager(viewPager);

2、设置默认显示项

tabLayout.getTabAt(pos).select();

3、定义viewPager的FragmentAdapter

public class  AmusementFragmentAdapter extends FragmentPagerAdapter {

    List<Fragment> fragmentList = new ArrayList<Fragment>();
    public List<AmusementResponse.TabListBean> tabItemses;

    public AmusementFragmentAdapter(FragmentManager fm, List<Fragment> fragmentList, List<AmusementResponse
            .TabListBean> itemses) {
        super(fm);
        this.fragmentList = fragmentList;
        this.tabItemses = itemses;
    }

    @Override
    public Fragment getItem(int position) {
        LogUtils.e("AmusementFragmentAdapter","getItem:"+position);
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return tabItemses == null ? 0 : tabItemses.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {

        return tabItemses.get(position).getName();
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        LogUtils.e("AmusementFragmentAdapter","destroyItem position:"+position);
    //    super.destroyItem(container, position, object);
    }

}

4、设置TabLayout显示模式及间距

 tabLayout.setTabMode(TabLayout.MODE_FIXED);

 private void setTabView() {
        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                try {
                    //拿到tabLayout的mTabStrip属性
                    Field mTabStripField = tabLayout.getClass().getDeclaredField("mTabStrip");
                    mTabStripField.setAccessible(true);

                    LinearLayout mTabStrip = (LinearLayout) mTabStripField.get(tabLayout);

                    int dp6 = Utils.dp2px(AmusementFragment2.this.getContext(), 6);
                    int dp3 = Utils.dp2px(AmusementFragment2.this.getContext(), 3);

                    for (int i = 0; i < mTabStrip.getChildCount(); i++) {
                        View tabView = mTabStrip.getChildAt(i);

                        //拿到tabView的mTextView属性
                        Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
                        mTextViewField.setAccessible(true);
                        TextView mTextView = (TextView) mTextViewField.get(tabView);
                        tabView.setPadding(0, 0, 0, 0);
                        //因为我想要的效果是   字多宽线就多宽,所以测量mTextView的宽度
                        int width = 0;
                        width = mTextView.getWidth();
                        if (width == 0) {
                            mTextView.measure(0, 0);
                            width = mTextView.getMeasuredWidth();
                        }

                        //设置tab左右间距为10dp  注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的
                        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
                        params.width = width + 2 * dp3;
                        params.leftMargin = dp3;
                        params.rightMargin = dp3;
                        tabView.setLayoutParams(params);
                        tabView.invalidate();
                    }
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        });
    }

5、监听横竖屏变化,x5 webview横屏看视频返回后 可能会出现view覆盖或异常的情况.

全屏切换后,Tab页中fragment使用的是new
的方式添加WebView到页面中,不添加WebView时进行全屏切换不会出现该问题,确认为WebView的问题。猜测为全屏时处理WebView所致。故在全屏时隐藏WebView所在的ViewPager,正常时再显示ViewPager

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
        {//横屏
          //  saveFragmentState(0,this);
            if(android.os.Build.VERSION.SDK_INT >= 26 ){
                viewPager.setVisibility(View.GONE);
            }
        }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            if(Utils.WEB_TAB_POS >= 0 && Utils.WEB_TAB_POS < tabList.size()){
                int pos = Utils.WEB_TAB_POS;
                try{
                    if(android.os.Build.VERSION.SDK_INT >= 26 ){
                        viewPager.setVisibility(View.VISIBLE);
                        if(tabLayout != null){
                            setTabView();
                        }
                    }
                    if(pos > 0){
                        viewPager.setCurrentItem(0);
                        viewPager.getAdapter().notifyDataSetChanged();
                        viewPager.setCurrentItem(pos);
                        viewPager.getAdapter().notifyDataSetChanged();
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
    }

6、fragment切换时,每个fragment的setUserVisibleHint函数被调用

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if(isVisibleToUser){
            Utils.WEB_TAB_POS = position;
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值