2012-07-05 7 views
56

Używam w pliku settings.xml ListPreference. Chcę pokazać użytkownikowi listę 3 opcji do wyboru. Gdy użytkownik wybierze jedną z opcji w ustawieniach, otrzymuję ten błąd:ListPreference: użyj tablicy łańcuchowej jako Entry i tablicy całkowitej, ponieważ wartości wpisów nie działają

java.lang.NullPointerException 
    at android.preference.ListPreference.onDialogClosed(ListPreference.java:264) 
    at android.preference.DialogPreference.onDismiss(DialogPreference.java:381) 
    at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1228) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4424) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    at dalvik.system.NativeStart.main(Native Method) 

Jest to kod ListPreference:

<ListPreference 
    android:entries="@array/date_alignement" 
    android:entryValues="@array/date_alignement_values" 
    android:key="settings_date_alignement" 
    android:summary="@string/settings_date_alignement_summary" 
    android:title="@string/settings_date_alignement_title" /> 

A oto tablice użyć do wypełnienia zapisów :

<string-array name="date_alignement"> 
    <item>"Top"</item> 
    <item>"Center"</item> 
    <item>"Bottom"</item> 
</string-array> 
<integer-array name="date_alignement_values"> 
    <item >0</item> 
    <item >1</item> 
    <item >2</item> 
</integer-array> 

W moim onSharedPreferenceChanged używam tych wartości w następujący sposób:

@Override 
public void onSharedPreferenceChanged(
      SharedPreferences sharedPreferences, String key) {   

     //Text 
     mAlignment = mPrefs.getInt(PREF_ALIGNMENT, 1); 
     switch (mAlignment) { 
     case 0: 
      offsetY = mHeight/3.0f; 
      break; 

     case 2: 
      offsetY = mHeight*2.0f/3.0f; 
      break; 

     default: 
      offsetY = mHeight/2.0f; 
      break; 
     } 
} 

Jeśli użyję innej tablicy napisów dla parametru entryValues ​​, to działa. Na przykład, jeśli mogę użyć tego samego tablicę ciągów jako wartości i wpisów:

android:entries="@array/date_alignement" 
    android:entryValues="@array/date_alignement" 

wtedy muszę zmienić mój kod trochę, ale to działa:

 if(mAlignment.equalsIgnoreCase("center")) { 
      offsetY = mHeight/2.0f; 
     } else if(mAlignment.equalsIgnoreCase("top")) { 
      offsetY = mHeight/3.0f; 
     } else if(mAlignment.equalsIgnoreCase("bottom")) { 
      offsetY = mHeight*2.0f/3.0f; 
     } 

Dlaczego nie mogę używać String tablica i tablica całkowita dla pozycji i wartości ListPreference?

+0

jestem sory za głupie pytanie, ale jaki typ zmiennej mAlignment używacie? i gdzie otrzymałeś PREF_ALIGNMENT? – Yarik

+0

W pierwszym przypadku mAlignment jest int. PREF_ALIGNMENT to nazwa wpisu w SharedPreferences, gdzie aktualna wartość wyrównania jest przechowywana – Santacrab

Odpowiedz

73

Odpowiedź jest prosta: ponieważ system Android został zaprojektowany w ten sposób. Używa tylko tablic String zarówno dla wpisów, jak i wartości wpisu i to wszystko. I nie widzę żadnego problemu w tym fakcie, ponieważ możesz łatwo przekonwertować String na int używając metody Integer.parseInt(). Mam nadzieję że to pomoże.

+21

OK, nadal nie rozumiem, dlaczego nie jest obsługiwana. Obviousely mogę i będę go konwertować, ale jeśli jest możliwe, aby użyć konkretnej struktury (integer-tablica) zamiast korzystania z ciągu jeden i przekonwertować go w int, powinno działać :) Dzięki! – Santacrab

+3

@Santacrab, Jeśli istniało wsparcie dla tablicy całkowitej, to powinno być również wsparcie dla tablic typu float, double, char itd. Byłby to wielki bałagan, więc myślę, że po prostu łatwiej jest przekonwertować ciąg na dowolny typ danych, jakiego potrzebujesz. Zaakceptuj odpowiedź, jeśli uznasz ją za przydatną. – Egor

+1

faktycznie istnieje struktura tablicy całkowitej. Problem polega na tym, że nie działa po sparowaniu z ciągiem. – Santacrab

3

Odpowiedź jest wymieniona na List Preference Documentation.

int findIndexOfValue (String value) 

zwróci indeks dla danej wartości i argument jest traktowana jako ciąg, więc tablica entryValues ​​powinna być tablica ciąg dostać tę pracę.

-2

Następujące pracował dla mnie:

String objectName = prefs.getString("listPrefMelodyYd1", ""); 
switch (objectName.toUpperCase()) { 
    case "1": 
     playSound(catSound); 
     break; 
    case "2": 
     playSound(dogSound); 
     break; 
    case "3": 
     playSound(cowSound); 
     break; 
} 
+0

Opisz problem poprawnie. –

Powiązane problemy