android — ListPreference: использовать строковый массив как Entry и целочисленный массив как Entry Values ​​не работает" />

ListPreference: использовать строковый массив как Entry и целочисленный массив как Entry Values ​​не работает

Я использую в файле settings.xml ссылку ListPreference. Я хочу показать пользователю список из 3 вариантов для выбора. Когда пользователь выбирает один из параметров в настройках, я получаю эту ошибку:

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)

Это код 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" />

А вот массивы, которые я использую для заполнения записей:

<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>

В моем onSharedPreferenceChanged я использую эти значения следующим образом:

@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;
        }
}

Если я использую другой массив строк для entryValues ​​, это работает. Например, если я использую тот же массив строк, что и значения и записи:

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

тогда я должен немного изменить свой код, но он работает:

        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;
        }

Почему я не могу использовать строковый массив и целочисленный массив для записей и значений ListPreference?

64 голоса | спросил Santacrab 5 J000000Thursday12 2012, 18:54:24

3 ответа


0

Ответ прост: потому что Android разработан таким образом. Он просто использует массивы String для записей и значений записей, и все. И я не вижу никаких проблем в этом, так как вы можете легко преобразовать String в int с использованием метода Integer.parseInt(). Надеюсь, это поможет.

ответил Egor 5 J000000Thursday12 2012, 19:03:55
0

Ответ указан в документации о предпочтениях списка .

int findIndexOfValue (String value)

вернет индекс для данного значения, а аргумент будет принят как String, поэтому массив entryValues ​​должен быть строковым массивом, чтобы получить эту работу.

ответил kasper 22 22016vEurope/Moscow11bEurope/MoscowTue, 22 Nov 2016 18:39:00 +0300 2016, 18:39:00
0

У меня сработало следующее:

String objectName = prefs.getString("listPrefMelodyYd1", "");
switch (objectName.toUpperCase()) {
    case "1":
        playSound(catSound);
        break;
    case "2":
        playSound(dogSound);
        break;
    case "3":
        playSound(cowSound);
        break;
}
ответил Александр 25 MonEurope/Moscow2017-12-25T15:12:02+03:00Europe/Moscow12bEurope/MoscowMon, 25 Dec 2017 15:12:02 +0300 2017, 15:12:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132