2010-04-19 6 views
12

J'ai une application, ce qui a un Spinner que je veux peuplée avec quelques chiffres (4,8,12,16). J'ai créé un objet-tableau entier strings.xml avec les éléments mentionnés ci-dessus, définissez les entrées du Spinner au-tableau entier, et quand je lance l'application que je reçois: DèsSpinner ne peut pas charger un tableau entier?

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) 

comme je l'ai changé le tableau à un tableau de chaînes, cela fonctionne bien. Est-ce normal? Je me rends compte que je peux (et) juste convertir les valeurs de tableau de chaînes à un int, mais il semble bizarre que je dois.

Merci!

EDIT: n'importe qui? N'importe quoi?

+0

hmm, je pensais que ce serait un simple réponse oui/non. – Adam

+0

Est-il possible que vous pouvez poster un code. Il sera plus facile de regarder le code plutôt qu'un NPE générique. –

Répondre

25

Qu'est-ce que vous essayez de faire est pas pris en charge.

Vous avez probablement un code qui ressemble à ceci:

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

Ce qui est bien sûr d'appeler les éléments suivants:

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

L'appel à getTextArray retourne un tableau avec des objets null plutôt que la représentation sous forme de chaîne des valeurs dans votre tableau d'entiers. Creuser plus profond révèle la source du problème est dans une méthode 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; 
} 

Ce code suppose que vous avez fourni l'identifiant de ressource d'un tableau de chaînes et donc il ne peut pas extraire correctement des valeurs de votre tableau de entiers.

+1

merci pour l'explication très en profondeur – Adam

+0

J'ai apprécié l'explication aussi bien. J'avais le sentiment que ce n'était pas soutenu, mais je ne pouvais pas vraiment trouver une raison pour cela - maintenant j'en ai un. – Azoreo

+0

Merci pour l'élucidation. J'ai eu le même problème lors de l'attribution d'un tableau d'entiers à un spinner dans un fichier de mise en page. – Hong

2

Pour résoudre ce problème, il suffit de mettre des guillemets autour des valeurs de votre int

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