底部放5个RadioButton,点击切换不同的Fragment

本文介绍了一种使用RadioButton切换Fragment的优化方法,避免了频繁的Fragment释放和创建,提高了用户体验。通过自定义布局和FragmentPagerAdapter实现,该方法简化了切换流程,减少了资源消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

       一般频繁切换Fragment会导致频繁的释放和创建,如果Fragment比较臃肿体验就非常不好了,这里分享一个方法。

正文

        一、应用场景  

              1、不使用ViewPager

              2、不能用replace来切换Fragment,会导致Fragment释放(调用onDestroyView)

         二、实现

                1、xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:layout_width="match_parent"
  3.     android:layout_height="match_parent"
  4.     android:orientation="vertical" >

  5.     <FrameLayout
  6.         android:id="@+id/container"
  7.         android:layout_width="match_parent"
  8.         android:layout_height="0dip"
  9.         android:layout_weight="1.0" >
  10.     </FrameLayout>

  11.     <RadioGroup
  12.         android:id="@+id/main_radio"
  13.         android:layout_width="fill_parent"
  14.         android:layout_height="wrap_content"
  15.         android:layout_gravity="bottom"
  16.         android:gravity="bottom"
  17.         android:layout_marginBottom="-6dp"
  18.         android:orientation="horizontal" >

  19.         <RadioButton
  20.             android:id="@+id/radio_button0"
  21.             style="@style/main_tab_bottom"
  22.             android:drawableTop="@drawable/bottom_1" />

  23.         <RadioButton
  24.             android:id="@+id/radio_button1"
  25.             style="@style/main_tab_bottom"
  26.             android:drawableTop="@drawable/bottom_2" />

  27.         <RadioButton
  28.             android:id="@+id/radio_button2"
  29.             style="@style/main_tab_bottom"
  30.             android:drawableTop="@drawable/bottom_3" />

  31.         <RadioButton
  32.             android:id="@+id/radio_button3"
  33.             style="@style/main_tab_bottom"
  34.             android:drawableTop="@drawable/bottom_4" />

  35.         <RadioButton
  36.             android:id="@+id/radio_button4"
  37.             style="@style/main_tab_bottom"
  38.             android:drawableTop="@drawable/bottom_5" />
  39.     </RadioGroup>

  40. </LinearLayout>
复制代码
代码说明:                                非常常见的底部放5个RadioButton,点击切换不同的Fragment。
                 2、Activity
                        为RadioButton设置setOnCheckedChangeListener事件,其他代码:
  1. @Override
  2.     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  3.         if (isChecked) {
  4.             Fragment fragment = (Fragment) mFragmentPagerAdapter.instantiateItem(mContainer, buttonView.getId());
  5.             mFragmentPagerAdapter.setPrimaryItem(mContainer, 0, fragment);
  6.             mFragmentPagerAdapter.finishUpdate(mContainer);
  7.         } 
  8.     }

  9.     private FragmentPagerAdapter mFragmentPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {

  10.         @Override
  11.         public Fragment getItem(int position) {
  12.             switch (position) {
  13.             case R.id.radio_button1:
  14.                 return new Fragment1();
  15.             case R.id.radio_button2:
  16.                 return new Fragment2();
  17.             case R.id.radio_button3:
  18.                 return new Fragment3();
  19.             case R.id.radio_button4:
  20.                 return new Fragment4();
  21.             case R.id.radio_button0:
  22.             default:
  23.                 return new Fragment0();
  24.             }
  25.         }

  26.         @Override
  27.         public int getCount() {
  28.             return 5;
  29.         }
  30.     };
复制代码
代码说明:
                        instantiateItem从FragmentManager中查找Fragment,找不到就getItem新建一个,setPrimaryItem设置隐藏和显示,最后finishUpdate提交事务。
                        mContainer就是xml中的FrameLayout。
          三、FragmentPagerAdapter核心代码
  1. @Override
  2.     public Object instantiateItem(ViewGroup container, int position) {
  3.         if (mCurTransaction == null) {
  4.             mCurTransaction = mFragmentManager.beginTransaction();
  5.         }

  6.         final long itemId = getItemId(position);

  7.         // Do we already have this fragment?
  8.         String name = makeFragmentName(container.getId(), itemId);
  9.         Fragment fragment = mFragmentManager.findFragmentByTag(name);
  10.         if (fragment != null) {
  11.             if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
  12.             mCurTransaction.attach(fragment);
  13.         } else {
  14.             fragment = getItem(position);
  15.             if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
  16.             mCurTransaction.add(container.getId(), fragment,
  17.                     makeFragmentName(container.getId(), itemId));
  18.         }
  19.         if (fragment != mCurrentPrimaryItem) {
  20.             fragment.setMenuVisibility(false);
  21.             fragment.setUserVisibleHint(false);
  22.         }

  23.         return fragment;
  24.     }

  25.     @Override
  26.     public void destroyItem(ViewGroup container, int position, Object object) {
  27.         if (mCurTransaction == null) {
  28.             mCurTransaction = mFragmentManager.beginTransaction();
  29.         }
  30.         if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
  31.                 + " v=" + ((Fragment)object).getView());
  32.         mCurTransaction.detach((Fragment)object);
  33.     }

  34.     @Override
  35.     public void setPrimaryItem(ViewGroup container, int position, Object object) {
  36.         Fragment fragment = (Fragment)object;
  37.         if (fragment != mCurrentPrimaryItem) {
  38.             if (mCurrentPrimaryItem != null) {
  39.                 mCurrentPrimaryItem.setMenuVisibility(false);
  40.                 mCurrentPrimaryItem.setUserVisibleHint(false);
  41.             }
  42.             if (fragment != null) {
  43.                 fragment.setMenuVisibility(true);
  44.                 fragment.setUserVisibleHint(true);
  45.             }
  46.             mCurrentPrimaryItem = fragment;
  47.         }
  48.     }

  49.     @Override
  50.     public void finishUpdate(ViewGroup container) {
  51.         if (mCurTransaction != null) {
  52.             mCurTransaction.commitAllowingStateLoss();
  53.             mCurTransaction = null;
  54.             mFragmentManager.executePendingTransactions();
  55.         }
  56.     }
复制代码
FragmentPagerAdapter是support包自带的类。
         四、注意 
                之前自己模拟ViewPager用attach、setMenuVisibility、setUserVisibleHint来控制Fragment的显示隐藏,经常会出现Fragment重叠现象,非常头疼,换了这个之后目前没有发现重叠现象。
   结束  
       需要多看看源码,才能很好的解决问题。
       转自农民伯伯:  http://over140.cnblogs.com  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值