国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 保存Fragment 切換狀態實例代碼

2019-12-12 05:55:07
字體:
來源:轉載
供稿:網友

前言

 一般頻繁切換Fragment會導致頻繁的釋放和創建,如果Fragment比較臃腫體驗就非常不好了,這里分享一個方法。

 正文

 一、應用場景

  1、不使用ViewPager

  2、不能用replace來切換Fragment,會導致Fragment釋放(調用onDestroyView)

 二、實現

1、xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <FrameLayout  android:id="@+id/container"  android:layout_width="match_parent"  android:layout_height="0dip"  android:layout_weight="1.0" > </FrameLayout> <RadioGroup  android:id="@+id/main_radio"  android:layout_width="fill_parent"  android:layout_height="wrap_content"  android:layout_gravity="bottom"  android:gravity="bottom"  android:layout_marginBottom="-6dp"  android:orientation="horizontal" >  <RadioButton   android:id="@+id/radio_button0"   style="@style/main_tab_bottom"   android:drawableTop="@drawable/bottom_1" />  <RadioButton   android:id="@+id/radio_button1"   style="@style/main_tab_bottom"   android:drawableTop="@drawable/bottom_2" />  <RadioButton   android:id="@+id/radio_button2"   style="@style/main_tab_bottom"   android:drawableTop="@drawable/bottom_3" />  <RadioButton   android:id="@+id/radio_button3"   style="@style/main_tab_bottom"   android:drawableTop="@drawable/bottom_4" />  <RadioButton   android:id="@+id/radio_button4"   style="@style/main_tab_bottom"   android:drawableTop="@drawable/bottom_5" /> </RadioGroup></LinearLayout>

代碼說明:

    非常常見的底部放5個RadioButton,點擊切換不同的Fragment。

  2、Activity

   為RadioButton設置setOnCheckedChangeListener事件,其他代碼:

 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {  if (isChecked) {   Fragment fragment = (Fragment) mFragmentPagerAdapter.instantiateItem(mContainer, buttonView.getId());   mFragmentPagerAdapter.setPrimaryItem(mContainer, 0, fragment);   mFragmentPagerAdapter.finishUpdate(mContainer);  }  } private FragmentPagerAdapter mFragmentPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {  @Override  public Fragment getItem(int position) {   switch (position) {   case R.id.radio_button1:    return new Fragment1();   case R.id.radio_button2:    return new Fragment2();   case R.id.radio_button3:    return new Fragment3();   case R.id.radio_button4:    return new Fragment4();   case R.id.radio_button0:   default:    return new Fragment0();   }  }  @Override  public int getCount() {   return 5;  } };

代碼說明:

   instantiateItem從FragmentManager中查找Fragment,找不到就getItem新建一個,setPrimaryItem設置隱藏和顯示,最后finishUpdate提交事務, mContainer就是xml中的FrameLayout。

 三、FragmentPagerAdapter核心代碼

 @Override public Object instantiateItem(ViewGroup container, int position) {  if (mCurTransaction == null) {   mCurTransaction = mFragmentManager.beginTransaction();  }  final long itemId = getItemId(position);  // Do we already have this fragment?  String name = makeFragmentName(container.getId(), itemId);  Fragment fragment = mFragmentManager.findFragmentByTag(name);  if (fragment != null) {   if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);   mCurTransaction.attach(fragment);  } else {   fragment = getItem(position);   if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);   mCurTransaction.add(container.getId(), fragment,     makeFragmentName(container.getId(), itemId));  }  if (fragment != mCurrentPrimaryItem) {   fragment.setMenuVisibility(false);   fragment.setUserVisibleHint(false);  }  return fragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) {  if (mCurTransaction == null) {   mCurTransaction = mFragmentManager.beginTransaction();  }  if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object    + " v=" + ((Fragment)object).getView());  mCurTransaction.detach((Fragment)object); } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) {  Fragment fragment = (Fragment)object;  if (fragment != mCurrentPrimaryItem) {   if (mCurrentPrimaryItem != null) {    mCurrentPrimaryItem.setMenuVisibility(false);    mCurrentPrimaryItem.setUserVisibleHint(false);   }   if (fragment != null) {    fragment.setMenuVisibility(true);    fragment.setUserVisibleHint(true);   }   mCurrentPrimaryItem = fragment;  } } @Override public void finishUpdate(ViewGroup container) {  if (mCurTransaction != null) {   mCurTransaction.commitAllowingStateLoss();   mCurTransaction = null;   mFragmentManager.executePendingTransactions();  }  public void setMenuVisibility(boolean menuVisible) {
        super.setMenuVisibility(menuVisible);
        if (this.getView() != null)
            this.getView().setVisibility(menuVisible ? View.VISIBLE : View.GONE);
    } }

FragmentPagerAdapter是support包自帶的類。

四、注意

  之前自己模擬ViewPager用attach、setMenuVisibility、setUserVisibleHint來控制Fragment的顯示隱藏,經常會出現Fragment重疊現象,非常頭疼,換了這個之后目前沒有發現重疊現象。

 結束:以上就是對Android Fragment 實例說明,希望能幫助有需要的同學。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 内乡县| 漾濞| 南雄市| 沁水县| 永福县| 泽库县| 青冈县| 旌德县| 洪泽县| 平武县| 叙永县| 安塞县| 湖南省| 富宁县| 莱州市| 什邡市| 张掖市| 鄂尔多斯市| 朝阳市| 浙江省| 大埔县| 方城县| 庄河市| 海城市| 大兴区| 五原县| 乌兰县| 松阳县| 灵寿县| 朝阳县| 河源市| 南阳市| 城固县| 板桥市| 平遥县| 志丹县| 安福县| 长丰县| 寿光市| 青阳县| 贺州市|