Fragement进阶学习

本文深入探讨了Android开发中Fragment回退栈的工作原理及Fragment与Activity之间的通信方式,包括如何通过代码实现Fragment的回退以及利用Fragment的TAG或ID获取Fragment实例进行操作。同时,阐述了在Fragment中获取Activity实例的方法,并强调了在Fragment中获取Context的正确做法。


一:用户点击Back,实际是Fragment回退栈不断的弹栈。(FragmentTransaction.addToBackStack(String))

  1. 代码中的用法:

tx.replace(R.id.id_content, fTwo, "TWO");       

 tx.addToBackStack(null);     如果确实该句代码,并不会加入到栈中,点击返回按钮,不会再出现到该页面的


2、Fragment与Activity通信

因为所有的Fragment都是依附于Activity的,所以通信起来并不复杂,大概归纳为:

a、如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法

b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。

c、在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。

注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。



3.个人感悟

getSupportFragmentManager()是 FragementActivity中的方法

### Android Fragment 使用或错误分析 在开发过程中遇到 `NullPointerException` 的问题通常是因为尝试访问一个未初始化的对象或者对象已经被销毁。根据提供的信息,以下是关于此问题的详细解析: #### 错误原因 异常提示表明程序试图调用 `PersistableBundle.getBoolean(String)` 方法,但由于变量 `b` 为 `null` 而抛出了 `NullPointerException`[^1]。这可能是由于以下原因之一: - 变量 `b` 并未正确赋值。 - 在某些情况下(例如配置更改、Fragment 生命周期事件等),数据丢失。 #### 关于 Fragment 的生命周期管理 如果问题是与 Fragment 相关,则需要特别注意其生命周期行为。Fragment 的生命周期与其宿主 Activity 密切关联,因此可能会因为不当的状态保存或恢复而导致崩溃。例如,在设备旋转或其他配置变化时,如果没有妥善处理 Bundle 数据传递,可能导致类似上述的 NullPointerException。 另外需要注意的是,`onTrimMemory(int level)` 是一种用于通知应用系统内存紧张的方法[^3]。虽然它本身并不直接涉及 Fragment 的使用,但如果应用在此回调中执行了清理操作(如清除缓存或释放资源),而这些资源又被 Fragment 所依赖,则可能间接引发此类问题。 #### 解决方案建议 为了防止这类错误发生,可以采取如下措施: 1. **检查参数有效性** 在调用任何方法之前先验证相关对象是否为空。对于上面提到的例子来说,可以在获取 Boolean 值前确认 PersistableBundle 不为空。 2. **合理利用 onSaveInstanceState 和 onRestoreInstanceState** 当涉及到屏幕方向改变等情况下的状态保持时,应重写这两个函数来存储并还原必要的实例字段。 3. **考虑 ViewModel 或其他架构组件的应用** 如果项目允许的话,推荐采用 Jetpack 提供的 ViewModel 来帮助解决因配置变更引起的重新创建问题。ViewModel 设计用来持有 UI 层所需的数据,并且能够在配置发生变化期间存活下来。 下面给出一段基于以上原则改进后的代码片段作为示范: ```kotlin override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val bundle = arguments ?: return try{ if(bundle.containsKey("key") && !bundle.getString("key").isNullOrEmpty()){ // 正常逻辑流程... }else{ throw IllegalArgumentException("Missing required argument 'key'") } }catch(e : Exception){ Log.e(TAG,"Error processing fragment arguments", e) } } ``` 通过这样的方式能够有效减少潜在的风险点。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值