2010-04-19 17 views
12

Tengo una aplicación, que tiene un hilandero que quiero poblada con algunos números (4,8,12,16). He creado un objeto entero-matriz en strings.xml con los artículos mencionados anteriormente, establece las entradas de la Spinner al entero-matriz, y cuando corro la aplicación consigo:¿Spinner no puede cargar una matriz de enteros?

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) 

Tan pronto como he cambiado la matriz a una matriz de cadenas, esto funciona bien. ¿Esto es normal? Me doy cuenta de que puedo (y lo haré) simplemente convertir los valores de la matriz a un int, pero parece extraño que deba hacerlo.

Gracias!

EDIT: cualquier persona? ¿Cualquier cosa?

+0

hmm, pensé que esto sería un simple sí/no contesta. – Adam

+0

¿Hay alguna forma de que pueda publicar algún código? Será más fácil mirar el código en lugar de un NPE genérico. –

Respuesta

25

lo que están tratando de hacer no es compatible.

Es posible que tenga un código que se parece a esto:

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

¿Qué es, por supuesto, llamando al siguiente:

/** 
* 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); 
} 

La llamada a getTextArray devuelve una matriz con los objetos nulos en lugar de la cadena de representación de los valores en su matriz entera. El cavar más profundo revela el origen del problema es en un método de 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; 
} 

Este código se supone que nos ha proporcionado el ID de recurso de una matriz de cadenas y por lo tanto no es capaz de extraer correctamente los valores de la matriz de enteros.

+1

gracias por la explicación en profundidad – Adam

+0

Aprecié la explicación también. Tenía la sensación de que no era compatible, pero realmente no podía encontrar una razón para eso, ahora tengo uno. – Azoreo

+0

Gracias por la elucidación. Tuve el mismo problema al asignar una matriz de enteros a un spinner en un archivo de diseño. – Hong

2

Para superar este problema, sólo tiene que poner comillas alrededor de su int valores

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