1

Я подготовил a simple test case at GitHub по моему вопросу и чувствую, что для его работы осталось всего несколько строк кода.PreferenceFragment не сохраняет значения - с тестовым футляром и скриншотом

В Android приложения У меня есть 1 активность (MainActivity.java) и 2 фрагмента (MainFragment.java и PrefFragment.java) - и при изменении значения в фрагменте предпочтений, они не сохраняются.

также значения по умолчанию не загружаются и резюме не обновляется:

app screenshot

Вот мой PrefFragment где я зарегистрировать общий PREFS слушателя - для того, чтобы обновить резюме - но для некоторых причина это никогда не называют:

public class PrefFragment extends PreferenceFragment 
    implements OnSharedPreferenceChangeListener { 

    public static final String BOOL_1 = "bool_1"; 
    public static final String STR_1 = "str_1"; 
    public static final String STR_2 = "str_2"; 

    private CheckBoxPreference mBool1; 
    private EditTextPreference mStr1; 
    private EditTextPreference mStr2; 
    private SharedPreferences mPrefs; 
    private Editor mEditor; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(false); 
     addPreferencesFromResource(R.xml.preferences); 
     mBool1 = (CheckBoxPreference) findPreference(BOOL_1); 
     mStr1 = (EditTextPreference) findPreference(STR_1); 
     mStr2 = (EditTextPreference) findPreference(STR_2); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     mPrefs = PreferenceManager.getDefaultSharedPreferences(activity); 
     mEditor = mPrefs.edit(); 
     mPrefs.registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mPrefs.unregisterOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences prefs, 
              String key) { 
     Log.d("onSharedPreferenceChanged", key); // XXX is never called 

     if (BOOL_1.equals(key)) { 
      boolean bool1 = prefs.getBoolean(key, false); 
      mBool1.setSummary(bool1 ? "Enabled" : "Disabled"); 
     } else if (STR_1.equals(key)) { 
      String str1 = prefs.getString(key, ""); 
      mStr1.setSummary(str1); 
     } else if (STR_2.equals(key)) { 
      String str2 = prefs.getString(key, ""); 
      mStr2.setSummary(str2); 
     }  
    }  
} 

А вот preference.xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 

    <PreferenceCategory 
     android:title="Category 1" 
     android:key="category_1"> 

     <CheckBoxPreference 
      android:key="bool_1" 
      android:title="Boolean 1" 
      android:summary="XXX how to set this? XXX" 
      android:defaultValue="false" /> 
     <EditTextPreference 
      android:dependency="bool_1" 
      android:key="str_1" 
      android:title="String 1" 
      android:summary="XXX how to set this? XXX" 
      android:defaultValue="change me" /> 
     <EditTextPreference 
      android:dependency="bool_1" 
      android:key="str_2" 
      android:title="String 2" 
      android:summary="XXX how to set this? XXX" 
      android:defaultValue="change me too" /> 
     </PreferenceCategory> 

</PreferenceScreen> 

Так что мой вопрос в том, как обрабатывать (загружать, сохранять) значения в PreferenceFragment? Мне действительно нужно расширить EditTextPreference и реализовать метод onDialogClosed в моем классе? Мне кажется, что это слишком тяжелый подход.

ответ

0

Хорошо, следующий, кажется, работает в PrefFragment.java:

@Override 
public void onResume() { 
    super.onResume(); 

    SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); 

    // CHANGE 1: load saved values to set the summaries 
    onSharedPreferenceChanged(prefs, BOOL_1); 
    onSharedPreferenceChanged(prefs, STR_1); 
    onSharedPreferenceChanged(prefs, STR_2); 

    // CHANGE 2: register shared prefs listener in onResume 
    prefs.registerOnSharedPreferenceChangeListener(this); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); 
    prefs.unregisterOnSharedPreferenceChangeListener(this); 
}