78

私は 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 エントリと値に string-array と integer-array を使用できないのはなぜですか?

4

4 に答える 4

91

答えは簡単です。Android はこのように設計されているからです。Stringエントリとエントリ値の両方に配列を使用するだけで、それだけです。メソッドを使用してaStringを anに簡単に変換できるため、この事実に問題はありません。お役に立てれば。intInteger.parseInt()

于 2012-07-05T15:03:55.423 に答える
3

答えはList Preference Documentationにリストされています。

int findIndexOfValue (String value)

指定された値のインデックスを返し、引数は文字列として取得されるため、この作業を行うには entryValues 配列を文字列配列にする必要があります。

于 2016-11-22T15:39:00.473 に答える