我有一个将字符串数组直接加载到其中的活动
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
答案 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);
// ...
}
您可以安全地在onAttach
和onDetach
回调之间的任何位置移动此初始化。检查fragment life-cycle以获得明确的想法。