在项目中fragmen的使用已经非常常见了。但是往往图方便用的是replace的方法进行的。方便是方便,但是replace是一个替换的过程,意思是remove掉当前的fragment,重新初始化一个new fragment进行替换,会重复完全执行新的fragment的生命周期。The new fragment to place in the container.官方文档解释说:replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。所以我们这里的思路往往是,add(),切换时hide()当前的碎片,show()想展示的碎片。
1、replace()
/*** 设置fragment** @param frg 碎片*/private void setFragment(Fragment frg) {//开启Fragment事务FragmentTransaction transaction = fm.beginTransaction();place(R.id.fra_counselor, frg);transactionmit();//提交}
2、switchContent(hide&&show)
/*** fragment 切换** @param from* @param to*/public void switchContent(Fragment from, Fragment to, int position) {if (mContent != to) {mContent = to;FragmentTransaction transaction = fm.beginTransaction();if (!to.isAdded()) { // 先判断是否被add过transaction.hide(from).add(R.id.fra_counselor, to, tags[position])mit(); // 隐藏当前的fragment,add下一个到Activity中} else {transaction.hide(from).show(to)mit(); // 隐藏当前的fragment,显示下一个}}}
注意:mContent是当前显示的fragment。tags是我们add()的时候记录的tags。由于一个容器添加多个fragment的id是相同的,所以只能通过手动添加tag来区分这些fragment。
3、ok。这里会有一个普遍的问题。fragment重叠的情况。
这是由于在手机内存不足的时候Activity被回收后重启所导致的Fragment重复创建和重叠的问题。
在Activity onCreate()中添加Fragment的时候一定不要忘了检查一下savedInstanceState,通过savedInstanceState是否为空来判断填充当前的状态。如果为空,则填充当前的context,若不为空,我们可以通过add时候的tag来找到对应的fragmemt,所有的碎片实例都是存在于内存中的,只是由于失去引用再次启动它的引用被销毁了。我们只要找到赋值给对应的碎片,再通过保存的状态来hide和show就好了。比较容易理解
我们这里采用的方式是:通过getSupportFragmentManager()找到所有的 Fragment,按记录的context碎片show()某一个Fragment,hide()其他所有的fragment。
/*** 状态检测 用于内存不足时activity被回收重启的时候保证fragment 不会重叠*/private void stateCheck(Bundle saveInstanceState) {if (saveInstanceState == null) {FragmentTransaction frs = fm.beginTransaction();mContent = mSaleCounselorF;frs.add(R.id.fra_counselor, mContent);frsmit();} else {//通过tag找回失去引用但是存在内存中的fragment.id相同CounselorFrag counselorSaleFrag = (CounselorFrag) getSupportFragmentManager().findFragmentByTag(tags[0]);CounselorFrag counselorServerFrag = (CounselorFrag) getSupportFragmentManager().findFragmentByTag(tags[1]);getSupportFragmentManager().beginTransaction().show(counselorSaleFrag).hide(counselorServerFrag)mit();}}
4、完整的代码片给下好了,可优化:
x.usercenter;import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.t.ContextCompat;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.TextView;fond.carservices.R;
fond.carservices.baseobj.BaseAct;
fond.carservicesmon.Constant;
fond.carservices.utils.JumpActivityUtil;
fond.carservices.utils.SharedPreferencesUtil;
fond.carservices.widget.AutoRadioGroup;/*** @description: 私家顾问* @Author zsj on 2017/3/1 14:48.*/public class MyCounselorAct extends BaseAct {private CounselorFrag mSaleCounselorF;//销售顾问private CounselorFrag mServerCounselorF;//服务顾问private AutoRadioGroup ragCounselor;//切换顾问private Fragment mContent;//记录选中的fragmentprivate FragmentManager fm;//fragement管理器private String[] tags = new String[]{Constant.PRECONSULANT, Constant.AFTERCONSULTANTID};//使用tab记录下标,由于每个fragment的id都是一样的。用tab区分@Overrideprotected int getLayoutId() {return R.layout.act_mycounselor;}@Overrideprotected void initView() {fraCounselor = getView(R.id.fra_counselor);ragCounselor = getView(R.id.rag_counselor);}@Overrideprotected void initData() {//默认销售顾问if (mSaleCounselorF == null) {mSaleCounselorF = new CounselorFrag();Bundle bundle = new Bundle();bundle.putString("type", Constant.PRECONSULANT);bundle.putString("consultant_id", (MyCounselorAct.this, "pre_consultant_id"));mSaleCounselorF.setArguments(bundle);}fm = getSupportFragmentManager();stateCheck(mSavedInstanceState);//状态检测,默认设置mcotext为顾问列表switchContent(mServerCounselorF, mSaleCounselorF, 0);}@Overrideprotected void initEvent() {//切换顾问列表ragCounselor.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {switch (checkedId) {//销售顾问case R.id.rab_salecounselor:
// if (mSaleCounselorF == null) {
// mSaleCounselorF = new CounselorFrag();
// Bundle bundle = new Bundle();
// bundle.putString("type", Constant.PRECONSULANT);
// bundle.putString("consultant_id", (MyCounselorAct.this, "pre_consultant_id"));
// mSaleCounselorF.setArguments(bundle);
// }switchContent(mServerCounselorF, mSaleCounselorF, 0);break;//服务顾问case R.id.rab_servercounselor:if (mServerCounselorF == null) {mServerCounselorF = new CounselorFrag();Bundle bundle1 = new Bundle();bundle1.putString("type", Constant.AFTERCONSULTANTID);bundle1.putString("consultant_id", (MyCounselorAct.this, "consultant_id"));mServerCounselorF.setArguments(bundle1);}switchContent(mSaleCounselorF, mServerCounselorF, 1);break;}}});}/*** fragment 切换** @param from* @param to*/public void switchContent(Fragment from, Fragment to, int position) {if (mContent != to) {mContent = to;FragmentTransaction transaction = fm.beginTransaction();if (!to.isAdded()) { // 先判断是否被add过transaction.hide(from).add(R.id.fra_counselor, to, tags[position])mit(); // 隐藏当前的fragment,add下一个到Activity中} else {transaction.hide(from).show(to)mit(); // 隐藏当前的fragment,显示下一个}}}/*** 状态检测 用于内存不足时的时候保证fragment不会重叠*/private void stateCheck(Bundle saveInstanceState) {if (saveInstanceState == null) {FragmentTransaction frs = fm.beginTransaction();mContent = mSaleCounselorF;frs.add(R.id.fra_counselor, mContent);frsmit();} else {//通过tag找回失去引用但是存在内存中的fragment.id相同CounselorFrag counselorSaleFrag = (CounselorFrag) getSupportFragmentManager().findFragmentByTag(tags[0]);CounselorFrag counselorServerFrag = (CounselorFrag) getSupportFragmentManager().findFragmentByTag(tags[1]);getSupportFragmentManager().beginTransaction().show(counselorSaleFrag).hide(counselorServerFrag)mit();}}
}
参考链接:.html
5、继续踩坑。have a nice day~
本文发布于:2024-01-29 11:23:31,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170649861514927.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |