IllegalStateException - Fragment.getResources

Mih*_*tel 3 android android-fragments android-activity android-fragmentactivity

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

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

另外,我可以使用以下实现吗,不确定它是否正确?初始化mActivityonAttach片段,然后用它来获得资源字符串。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof Activity) {
        mActivity = (Activity) context;
    }
}
Run Code Online (Sandbox Code Playgroud)

代替

 getString(R.string.string_resource)
Run Code Online (Sandbox Code Playgroud)

mActivity.getString(R.string.string_resource)
Run Code Online (Sandbox Code Playgroud)

我可以放心,使用它会停止IllegalStateExceptions吗?

kco*_*ock 5

我可以确定使用它会阻止 IllegalStateExceptions 吗?

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

您的问题是您在getString()生命周期的无效部分调用。您提到您在 Retrofit 响应中遇到这种情况,因此我的假设是您在 内提交网络请求Fragment,并提供匿名响应侦听器(其中包含对您的 的引用Fragment)。即使在Fragment分离后该请求也会继续,然后在您的响应侦听器中调用getString().

考虑转移到Android 架构组件(特别是ViewModelLiveData),并让您ViewModel执行请求,并将结果发布到 a LiveData(您Fragment可以观察到)。这样你就可以保证只在有效的生命周期状态期间处理结果,此外,请求将在配置更改后继续存在。