PreferenceActivity дает NullPointerException, когда опция выбрана из ListPreference.

Я новичок в использовании PreferenceActivity.

Задача: Разрешить пользователю выбирать макет программы из Preferences

Проблема: При выборе опции в PreferenceList возникает исключение NullPointerException

Исключение: При android.preference.ListPreference.onDialogClosed ()

alt text

(Сокращенный) Код:

private static final String PREF_LAYOUT_KEY = "PrefLayout";
private static final int DEFAULT_LAYOUT = LayoutHelper.LAYOUT_DOUBLE ;
private static int mListLayout = DEFAULT_LAYOUT ;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
    pref.registerOnSharedPreferenceChangeListener(this);
    mListLayout = pref.getInt(PREF_LAYOUT_KEY, DEFAULT_LAYOUT);
}

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

    Log.v(TAG, "OnSharedPreferencesChanged run" ); // TODO Testing Purposes

    if( key.equals( PREF_LAYOUT_KEY ) ){
        mListLayout = pref.getInt(key, DEFAULT_LAYOUT);
    }
}

[PreferenceActivity]

public class Preferences extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.pref);
    }
}

[Рез / XML / pref.xml]

<PreferenceCategory
    android:title="@string/pref_cat1_title">

    <ListPreference
        android:title="@string/pref_layout_name"
        android:summary="@+id/pref_chosen_layout"
        android:key="PrefLayout"
        android:entries="@array/prefLayoutOptions"
        android:entryValues="@array/prefLayoutOptionsValues"
    />
</PreferenceCategory>

[Strings.xml]

<string name="pref_cat1_title">Layout</string>
    <string name="pref_layout_name">"Layout of list"</string>
        <array name="prefLayoutOptions">
            <item>Layout 1 (single)</item>
            <item>Layout 2 (double)</item>
            <item>Layout 3 (triple)</item>
            <item>Layout 4 (quad)</item>
        </array>
        <array name="prefLayoutOptionsValues">
            <item>50</item>
            <item>51</item>
            <item>52</item>
            <item>53</item>
        </array>

Кусок кода, который регистрирует выполнение OnSharedPreferencesChanged, никогда не попадает туда.

Кто-нибудь может увидеть, где я ошибся?

РЕДАКТИРОВАТЬ. Вот вершина трассировки стека:

E/AndroidRuntime( 2707): java.lang.NullPointerException
E/AndroidRuntime( 2707):        at android.preference.ListPreference.onDialogClosed(ListPreference.java:218)
E/AndroidRuntime( 2707):        at android.preference.DialogPreference.onDismiss(DialogPreference.java:384)
E/AndroidRuntime( 2707):        at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1047)
E/AndroidRuntime( 2707):        at android.os.Handler.dispatchMessage(Handler.java:99)
7
задан HXCaine 22 August 2010 в 21:13
поделиться

3 ответа

mListLayout = pref.getInt(PREF_LAYOUT_KEY, DEFAULT_LAYOUT);

Это не удастся, потому что предпочтение является строкой, а не целым числом.

<array name="prefLayoutOptions">
<array name="prefLayoutOptionsValues">

Измените их на . Вот пример проекта, демонстрирующий использование ListPreference.

19
ответ дан 6 December 2019 в 07:04
поделиться

Я думаю, вам нужно установить слушателя изменений предпочтений прямо в активности, попробуйте поместить это в onCreate активности:

    Map<String, ?> prefs = this.getPreferenceManager().getSharedPreferences().getAll();
    for (String preferenceName : prefs.keySet()) {
        Preference p = this.findPreference(preferenceName);
        if (p != null) {
            Object value = prefs.get(preferenceName);
            p.setOnPreferenceChangeListener(this);
        }
    }
0
ответ дан 6 December 2019 в 07:04
поделиться

Я столкнулся с той же проблемой. Похоже, что можно использовать только строковые значения: http://code.google.com/p/android/issues/detail?id=2096

/Håkan

6
ответ дан 6 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

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