android - IllegalStateException - Fragment.getResources

标签 android android-fragments android-activity android-fragmentactivity

在我的 fragment 中,我在很多地方都使用了资源字符串。 理想情况下,一切正常。

但是,我经常收到关于 IllegalStateException 的崩溃报告,说 Fragment 没有附加到 Activity。 我能想象到的一种可能的解决方案是使用 isAdded() 方法,该方法返回 fragment 是否附加到 Activity ,但在访问字符串资源之前在所有地方使用它对我来说似乎不是正确的解决方案,因为它会破坏流程。

另外,我可以使用下面的实现,不确定它是否正确? 在fragment的onAttach上初始化mActivity,然后用它来获取资源字符串。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof Activity) {
        mActivity = (Activity) context;
    }
}

代替

 getString(R.string.string_resource)

使用

mActivity.getString(R.string.string_resource)

我可以确信使用它会停止 IllegalStateExceptions 吗?

最佳答案

Can I be assured that using this will stop the IllegalStateExceptions?

不,绝对不是。 Fragment.getString() 在内部委托(delegate)给 requireContext().getResources()requireContext() 只会返回一个值,而 Fragment 附加到 Activity。所以你真的会遇到同样的问题,但代码更多。

您的问题是您在生命周期的无效部分调用了 getString()。你提到你在 Retrofit 响应中发生了这种情况,所以我的假设是你在 Fragment 中提交网络请求,并提供一个匿名响应监听器(它包含对你的引用 fragment )。即使在 Fragment 分离后,该请求仍将继续,然后在您的响应监听器中调用 getString()

考虑移动到 Android Architecture Components (特别是 ViewModelLiveData ),并让您的 ViewModel 执行请求,并将结果发布到 LiveData(您的 Fragment 可以观察)。这样你就可以保证只在有效的生命周期状态下处理结果,而且请求将在配置更改后继续存在。

关于android - IllegalStateException - Fragment.getResources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51751034/

相关文章:

android - 从android中的其他类动态添加对象到listview

android - 布局膨胀后数据绑定(bind)方法何时触发?

android - 在 Activity 之间切换时显示白屏

android - 如何共享元素从 fragment 过渡到 Activity

java - 将值设置为枚举 - Java

android - 通过 HTTPS 传输 MP4 视频时 MediaPlayer 出现错误

java - Restful Web 服务 Struts 2

android - 添加 fragment 时出现 NullPointerException 错误

android - 如何使 fragment 从顶部工具栏显示到底部

android - 使用自定义启动器向应用程序图标添加叠加层