大佬教程收集整理的这篇文章主要介绍了Android 保存Fragment 切换状态实例代码,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
前言
一般频繁切换Fragment会导致频繁的释放和创建,如果Fragment比较臃肿体验就非常不好了,这里分享一个方法。
正文
一、应用场景
1、不使用ViewPager
2、不能用replace来切换Fragment,会导致Fragment释放(调用onDestroyView)
二、实现
1、xml
<LinearLayout xmlns:android="http://scheR_300_11845@as.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,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,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 实例说明,希望能帮助有需要的同学。
以上是大佬教程为你收集整理的Android 保存Fragment 切换状态实例代码全部内容,希望文章能够帮你解决Android 保存Fragment 切换状态实例代码所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。