使用资源文件时,片段未附加到活动

时间:2017-02-19 22:43:06

标签: android

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

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

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

名为问题的资源文件

<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

1 个答案:

答案 0 :(得分:1)

发生了什么事?

您的实际代码所做的是它在Fragment实例化时尝试访问资源,这是错误的,因为除非Fragment附加到某些Activity,否则资源将无法使用1}}。

来电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