Fragment切换返回

本文介绍了一种在Android应用中高效管理Fragment的方法,包括初始化、切换Fragment的步骤,以及如何通过封装返回监听来避免内存泄漏。此外,还展示了如何利用FABridge简化Fragment与Activity间的交互。

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

1.开发中遇到需要在Fragment之间切换,保存状态
(1).初始化Fragment:
1 public void initFragment(){
2         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
3         ft.replace(R.id.fl_container,onCreteFragment());
4         ft.commitAllowingStateLoss();//允许丢失,一般可以不用这个采用commit()替代
5 }

(2).切换Fragment算法:

1 public void switchFragment(Fragment from, Fragment to) {
2         FragmentTransaction mFragmentTransaction = getSupportFragmentManager().beginTransaction();
3         if (!to.isAdded()) { // 先判断是否被add过
4             mFragmentTransaction.hide(from).add(R.id.fl_container, to)
5                     .commit(); // 隐藏当前的fragment,add下一个到Activity中
6         } else {
7             mFragmentTransaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
8         }
9 }

(3).封装返回监听,采用弱引用和静态内部类,避免内存泄漏

 1 public static class MyOnBackListener implements BaseFragment.OnBackListener {
 2         private final WeakReference<BaseFragment> mBaseFragment;//目的Fragment
 3         private final WeakReference<BaseFragmentActivity> mBaseActivity;
 4         /**
 5          * @param toFragment 跳转目的Fragment
 6          * @param baseActivit 当前BaseActivity
 7          */
 8         public MyOnBackListener(BaseFragment toFragment,BaseFragmentActivity baseActivit) {
 9             mBaseFragment =new WeakReference<>(toFragment);
10             mBaseActivity =new WeakReference<>(baseActivit);
11         }
12 
13         @Override
14         public void back(BaseFragment baseFragment) {
15             BaseFragmentActivity baseActivity = mBaseActivity.get();
16             BaseFragment baseFragment2 = mBaseFragment.get();
17             if (baseActivity !=null&& baseFragment2 !=null&&baseFragment!=null){
18                 baseActivity.switchFragment(baseFragment,baseFragment2);
19             }
20         }
21     }

(4).Activity中简单使用:

private void initLocalFragment() {
        mRfbf = new RecyclerFabBehaviorFragment();
        mRfbf.setOnBackListener(new MyOnBackListener(mStartRecycFragment,this));
 }
1 @Override
2 public void click(View view, int position) {
3         switch (position){
4             case 0:
5                 switchFragment(mStartRecycFragment, mRfbf);
6                 break;
7         }
8  }

(5).子类Fragment中记得调用back:eg 

TabyoutViewPagerFragment extends BaseFragment
private void initToolbar() {
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnBackListener!=null){
                    mOnBackListener.back(TabyoutViewPagerFragment.this);
                }
            }
        });
}

(6).可以采用鸿阳的FABridge来简化Fragment中定义接口在Activity中回调

annotationProcessor 'com.zhy.fabridge:fabridge-compiler:1.0.0'
implementation 'com.zhy.fabridge:fabridge-api:1.0.0'

Fragment中定义

Fabridge.call(getActivity(), EVENT_CLICK, "来了");

Activity中使用

@FCallbackId(id = FabrigeSampleFragment.EVENT_CLICK)
public void menuItemClick(String title)
{
    Toast.makeText(this, ""+title+","+Thread.currentThread().getName(), Toast.LENGTH_SHORT).show();
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 

转载于:https://www.cnblogs.com/jeffery336699/p/9288630.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值