【问题标题】:Fragment not attached to activity when using resource file使用资源文件时片段未附加到活动
【发布时间】:2017-02-19 22:43:05
【问题描述】:

我有一个将字符串数组直接加载到其中的活动

private String[] questions = {"Q1", "Q2", "Q3"};
private String[] answers= {"A1", "A2", "A3"};

我想将其更改为从资源文件加载

名为 Questions 的资源文件

<string-array name="questions">
    <item>Q1</item>
    <item>Q2</item>
    <item>Q3</item>
</string-array>

<string-array name="answers">
    <item>A1</item>
    <item>A2</item>
    <item>A3</item>
</string-array>

将字符串数组改为

private String[] questions = getResources().getStringArray(R.array.questions);
private String[] answers= getResources().getStringArray(R.array.answers);

当我将它更改为从资源文件中提取字符串数组时,它给了我

java.lang.IllegalStateException: My_Fragment{38ad4cd} not attached to Activity

【问题讨论】:

  • 你在哪里调用 getResources()?
  • 报错表示fragment还没有被附加到对应的activity上,可能这个方法调用的太早了吧?
  • 试试getActivity().getResources()

标签: android


【解决方案1】:

发生了什么事?

您的实际代码所做的是在实例化Fragment 时尝试访问资源,这是错误的,因为除非您的Fragment 附加到某个Activity,否则资源将不可用。

加号

调用getResources() 只是getActivity().getResources() 的快捷方式。我的猜测是它的实现是这样的:

if(isAttached()) {
    return getActivity().getResources();
} else {
    throw new RuntimeException("Fragment is not attached...");
}

解决方案

移动这个初始化:

private String[] questions = getResources().getStringArray(R.array.questions);
private String[] answers = getResources().getStringArray(R.array.answers);

到您的onCreateView 方法:

private String[] questions;
private String[] answers;

public void onCreateView(...){
    // ...
    questions = getResources().getStringArray(R.array.questions);
    answers = getResources().getStringArray(R.array.answers);
    // ...
}

注意

您可以安全地将此初始化移动到 onAttachonDetach 回调之间的任何位置。查看fragment life-cycle 以获得清晰的想法。

类似的问题,但有一个活动

App crashing when fetching from string ressources.

【讨论】:

  • 完成了这项工作。不敢相信它是如此简单。谢谢!
猜你喜欢
  • 2015-04-24
  • 2018-01-05
  • 2014-04-13
  • 2012-12-01
  • 2021-09-02
  • 2023-03-26
  • 2021-09-16
  • 1970-01-01
相关资源
最近更新 更多