У меня есть Preferenceactivity с EditTextPreference.

Я ищу команду для доступа к вставленному тексту EditTextPreference из фрагмента.

Что у меня есть:

SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
        String name = preferences.getString("edit_text_preference_name", "Default");

Я всегда получаю «По умолчанию» вместо фактического вставленного текста из EditTextPreference.

Заранее спасибо.

Изменить:

Из SettingsActivity.java

 @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class BarcodePreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_barcode);
            setHasOptionsMenu(true);

            bindPreferenceSummaryToValue(findPreference("edit_text_preference_barcode"));
            bindPreferenceSummaryToValue(findPreference("edit_text_preference_name"));
        }
}

Pref.xml

<EditTextPreference
        android:capitalize="words"
        android:defaultValue="@string/pref_default_display_name"
        android:key="edit_text_preference_name"
        android:maxLines="1"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:title="@string/pref_default_display_name" />
1
Makarele 23 Июн 2017 в 21:07
Покажите нам источник PreferenceActivity, потому что мне кажется, что вы пытаетесь получить доступ к полю из общего префикса с именем «pref», в то время как ваш PreferenceActivity сохраняет его в другом (возможно, по умолчанию).
 – 
Gergely Kőrössy
23 Июн 2017 в 21:14
.java файл, .xml или оба?
 – 
Makarele
23 Июн 2017 в 21:19
Ява. Я предполагаю, что ключ EditTextPreference - edit_text_preference_name.
 – 
Gergely Kőrössy
23 Июн 2017 в 21:23

1 ответ

Лучший ответ

Из документации PreferenceFragment:

Чтобы получить экземпляр SharedPreferences, который будет использовать иерархия предпочтений в этом фрагменте, вызовите getDefaultSharedPreferences(android.content.Context) с контекстом в том же пакете, что и этот фрагмент.

Это означает, что PreferenceFragment сохраняет значения в общих предпочтениях по умолчанию, что оставляет вам два варианта:

Вариант 1. Используйте значение по умолчанию SharedPreferences, чтобы получить сохраненное значение.

Это довольно просто, вам нужно вызвать PreferenceManager getDefaultSharedPreferences(...) статический метод для доступа к общим параметрам по умолчанию. Так что вместо

SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
String name = preferences.getString("edit_text_preference_name", "Default");

Делать

// use getActivity() instead of getContext() if you're using the framework Fragment API and min SDK is lower than 23
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
String name = preferences.getString("edit_text_preference_name", "Default");

Вариант 2. Настройте PreferenceFragment на использование именованных общих настроек

Вы можете установить имя используемых общих настроек в методе onCreate(...) вашего BarcodePreferenceFragment, вызвав setSharedPreferencesName(...) о принадлежности PreferenceManager:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getPreferenceManager().setSharedPreferencesName("pref");
    // the rest of your code
}
1
Gergely Kőrössy 23 Июн 2017 в 23:08
Во-первых, большое спасибо! Вариант 1 у меня отлично работает. У меня только одна проблема: мое приложение должно поддерживать минимальный API 16, а "getContext" был введен в API 23. Вы можете мне с этим помочь? Я все равно приму ваш ответ, но было бы здорово, если бы вы мне помогли с этим!
 – 
Makarele
23 Июн 2017 в 22:44
Извините, я обычно использую фрагменты поддержки, в которых есть getContext(). Вместо этого вы можете использовать getActivity(), если фрагмент уже был прикреплен к Activity.
 – 
Gergely Kőrössy
23 Июн 2017 в 23:06