从硬编码字符串数组切换到 getStringArray() 时崩溃
Crash when switching from hard coded string array to getStringArray()
我有一个简单的 ArrayAdapter,其中填充了一个字符串数组。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
inflater.getContext(), android.R.layout.simple_list_item_1,
numbers_text);
当我传入这样的字符串时,一切正常。
String[] numbers_text = new String[] { "one", "two", "three", "four" };
但是当我这样声明字符串时,它崩溃了。
Resources res = getResources();
String[] numbers_text = res.getStringArray(R.array.Planets);
这里是否遗漏了任何逻辑错误?
xml 字符串数组:
<string-array name="Planets">
<item>Sun</item>
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array>
编辑:发布更新后的代码,将字符串声明移至函数中
public class SimpleListFragment extends ListFragment
{
Resources res = getActivity().getResources();
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
String[] numbers_digits = res.getStringArray(R.array.Planets);
new CustomToast(getActivity(), numbers_digits[(int) id]);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String[] numbers_text = res.getStringArray(R.array.Planets);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
inflater.getContext(), android.R.layout.simple_list_item_1,
numbers_text);
setListAdapter(adapter);
return super.onCreateView(inflater, container, savedInstanceState);
}
}
要访问您需要有效 Context
的资源。将 numbers_text
的初始化移动到回调中,例如
onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String[] numbers_text = getResources().getStringArray(R.array.Planets);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
inflater.getContext(), android.R.layout.simple_list_item_1,
numbers_text);
setListAdapter(adapter);
return super.onCreateView(inflater, container, savedInstanceState);
}
您可以使用变量 res
,但在 onCreate(...)
中启动它,例如:
public class SimpleListFragment extends ListFragment
{
Resources res;
@Override
onCreate(...)
{
res = getActivity().getResources();
}
}
然后你在 class 范围内使用 res
我有一个简单的 ArrayAdapter,其中填充了一个字符串数组。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
inflater.getContext(), android.R.layout.simple_list_item_1,
numbers_text);
当我传入这样的字符串时,一切正常。
String[] numbers_text = new String[] { "one", "two", "three", "four" };
但是当我这样声明字符串时,它崩溃了。
Resources res = getResources();
String[] numbers_text = res.getStringArray(R.array.Planets);
这里是否遗漏了任何逻辑错误?
xml 字符串数组:
<string-array name="Planets">
<item>Sun</item>
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array>
编辑:发布更新后的代码,将字符串声明移至函数中
public class SimpleListFragment extends ListFragment
{
Resources res = getActivity().getResources();
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
String[] numbers_digits = res.getStringArray(R.array.Planets);
new CustomToast(getActivity(), numbers_digits[(int) id]);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String[] numbers_text = res.getStringArray(R.array.Planets);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
inflater.getContext(), android.R.layout.simple_list_item_1,
numbers_text);
setListAdapter(adapter);
return super.onCreateView(inflater, container, savedInstanceState);
}
}
要访问您需要有效 Context
的资源。将 numbers_text
的初始化移动到回调中,例如
onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
String[] numbers_text = getResources().getStringArray(R.array.Planets);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
inflater.getContext(), android.R.layout.simple_list_item_1,
numbers_text);
setListAdapter(adapter);
return super.onCreateView(inflater, container, savedInstanceState);
}
您可以使用变量 res
,但在 onCreate(...)
中启动它,例如:
public class SimpleListFragment extends ListFragment
{
Resources res;
@Override
onCreate(...)
{
res = getActivity().getResources();
}
}
然后你在 class 范围内使用 res