2010-04-19 65 views
12

我有一个应用程序,它有一个微调,我想填充一些数字(4,8,12,16)。我在与上述物品的strings.xml创建一个整数数组对象,设置Spinner的条目为整数阵列,并且当我运行应用程序获取:微调不能加载整数数组?

04-19 23:38:48.016: ERROR/AndroidRuntime(10193): java.lang.NullPointerException 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:198) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.View.measure(View.java:7965) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:350) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.View.measure(View.java:7965) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.View.measure(View.java:7965) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:464) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.View.measure(View.java:7965) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.View.measure(View.java:7965) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.ViewRoot.performTraversals(ViewRoot.java:763) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1632) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.os.Looper.loop(Looper.java:123) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.app.ActivityThread.main(ActivityThread.java:4310) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at dalvik.system.NativeStart.main(Native Method) 

只要我改变该数组为一个字符串数组,这工作正常。这是正常的吗?我意识到我可以(也将)只是将字符串数组的值转换为一个int,但它似乎很奇怪,我必须。

谢谢!

编辑:任何人?什么?

+0

嗯,我认为这将是一个简单的是/否的答案。 – Adam 2010-04-20 21:01:23

+0

有没有什么办法可以发布一些代码。查看代码比通用的NPE更容易。 – 2010-05-20 23:44:34

回答

25

不支持您正在尝试执行的操作。

你可能有一些代码,看起来像这样:

ArrayAdapter adapter = ArrayAdapter.createFromResource(this, 
    R.array.numbers, android.R.layout.simple_spinner_item); 

这当然是调用以下:

/** 
* Creates a new ArrayAdapter from external resources. The content of the array 
* is obtained through {@link android.content.res.Resources#getTextArray(int)}. 
* 
* @param context The application's environment. 
* @param textArrayResId The identifier of the array to use as the data source. 
* @param textViewResId The identifier of the layout used to create views. 
* 
* @return An ArrayAdapter<CharSequence>. 
*/ 
public static ArrayAdapter<CharSequence> createFromResource(Context context, 
     int textArrayResId, int textViewResId) { 
    CharSequence[] strings = context.getResources().getTextArray(textArrayResId); 
    return new ArrayAdapter<CharSequence>(context, textViewResId, strings); 
} 

getTextArray的调用会返回null对象上的数组,而不是整数数组中值的字符串表示。在深入揭示了问题的根源是在AssetManager方法:

/** 
* Retrieve the text array associated with a particular resource 
* identifier. 
* @param id Resource id of the string array 
*/ 
/*package*/ final CharSequence[] getResourceTextArray(final int id) { 
    int[] rawInfoArray = getArrayStringInfo(id); 
    int rawInfoArrayLen = rawInfoArray.length; 
    final int infoArrayLen = rawInfoArrayLen/2; 
    int block; 
    int index; 
    CharSequence[] retArray = new CharSequence[infoArrayLen]; 
    for (int i = 0, j = 0; i < rawInfoArrayLen; i = i + 2, j++) { 
     block = rawInfoArray[i]; 
     index = rawInfoArray[i + 1]; 
     retArray[j] = index >= 0 ? mStringBlocks[block].get(index) : null; 
    } 
    return retArray; 
} 

此代码假定您提供一个字符串数组的资源ID,因此它不能正确地从数组中提取出来的值整数。

+1

非常感谢深入的解释 – Adam 2010-05-24 03:04:34

+0

我赞赏解释以及。我有一种感觉它没有得到支持,但我无法找到一个原因 - 现在我有一个。 – Azoreo 2012-02-16 21:59:23

+0

感谢您的澄清。将整数数组分配给布局文件中的微调器时,我遇到了同样的问题。 – Hong 2012-12-31 20:29:30

2

为了克服这个问题,只需把引号的国际价值

<array name="spinner_value"> 
    <item>"18"</item> 
    <item>"8"</item> 
</array>