android之getSupportFragmentManager介绍

image.png

getSupportFragmentManager

getSupportFragmentManager()主要用于支持 3.0以下android系统API版本,3.0以上系统可以直接调用getFragmentManager() ,因为fragment是3.0以后才出现的组件,

为了这之前的系统版本也能使用fragment,借助V4包里面的getSupportFragmentManager()方法来间接获取FragmentManager()对象,3.0版本之后,有了Fragment的api,就可以直接使getFragmentManager()这个方法来获取对象。

FragmentManager

FragmentManager顾名思义是用来管理fragment的.

getSupportFragmentManager()就是获取所在fragment 的父容器的管理器,
getFragmentManager()同理。

getChildFragmentManager()所得到的是在fragment 里面子容器的管理器。

FragmentManager宿主环境指的是其管理类,通常在Activity中通过接口getSupportFragmentManager或者getFragmentManager获得FragmentManager对象, 可以认为Activity是FragmentManager的宿主环境类.

FragmentManager宿主环境类状态变化时(如onStart, onResume, onStop等回调),FragmentManager的状态也随之更新(FragmentManager类有一个成员变量mCurState来记录当前状态),同时会同步其管理的所有Fragment的状态.

从用户的角度来看, FragmentManager的宿主环境类管理了一系列Fragment,并且Fragment随着FragmentMannager的宿主环境类的状态变化而变化.

image.png
Android中,由于`getSupportFragmentManager()`是Activity特有的方法,直接在子线程中调用它会抛出`IllegalStateException`,因为子线程不具备处理UI操作的能力。要在子线程中处理FragmentManager的操作,你需要遵守以下步骤: 1. **主线程回调**: 使用异步处理机制,如`AsyncTask`、`HandlerThread`、或者RxJava、Kotlin Coroutines等,在子线程完成耗时任务后,把结果传递回主线程。这时可以在主线程的安全环境中更新界面,包括展示Fragment。 ```java new AsyncTask<Void, Void, Fragment>() { @Override protected Fragment doInBackground(Void... voids) { // 在这里执行耗时操作 Bundle args = ...; return getSupportFragmentManager().instantiateFragmentByTag("tag", args); } @Override protected void onPostExecute(Fragment fragment) { if (fragment != null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, fragment, "tag") .commit(); } } }.execute(); ``` 2. **使用FragmentTransaction API**: 在子线程里创建Fragment并存储到`Bundle`,然后在主线程中的合适时刻用`FragmentTransaction`替换Fragment。 ```java Fragment fragment = ...; // 在子线程创建的Fragment runOnUiThread(new Runnable() { @Override public void run() { getSupportFragmentManager().beginTransaction() .replace(R.id.container, fragment) .commit(); } }); ``` 3. **使用ViewModel或LiveData**: 如果需要持久的数据和观察者模式,可以使用ViewModel库,它允许在主线程之外更新数据,然后在需要更新UI的地方触发通知。 ```kotlin val viewModel = ViewModelProvider(this).get(MyViewModel::class.java) viewModel.showFragment().observe(this, Observer { fragment -> if (fragment != null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, fragment) .commit() } }) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_李小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值