3

我有一個首選片段,它們上面有一些EditTextPreference項目。每次我加載首選項片段時,顯示的值都是默認值,存儲在sharedPreferences中的值是默認值。如何在菜單加載時讓這些編輯文本始終顯示來自sharedPreferences的文本?我試圖使用片段訪問sharedPreferences:EditTextPreference始終顯示加載時的默認摘要android

SharedPreferences def = getActivity().getPreferences(0); 
Log.v("Something", def.getString("relay1_name", "no")); 

,但如果我嘗試訪問任意鍵我剛剛得到的默認文本後面。文本輸入被保存在sharedPreferences中,因爲如果我點擊一個editText,那麼我設置的文本就已經準備好了,它只是摘要顯示了默認文本。 非常感謝您的幫助,我很可能錯過了一些非常簡單的事情。

XML的喜好屏幕

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
<PreferenceCategory 

    android:title="@string/prefs_relay_title"> 
    <EditTextPreference 
     android:dialogTitle="Relay1" 
     android:key="relay1_name" 
     android:summary="Relay 1" 
     android:title="Relay 1" 
     android:defaultValue="Relay 1" /> 

</PreferenceCategory> 
</PreferenceScreen> 

行動,其中片段創建 公共類PrefsActivity延伸活動{

public static final String PREFS_NAME = "prefs"; 

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

    getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit(); // Load the prefs screen up 
} 
} 

首選項片段本身

public class PrefsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener { 

//public static final String PREFS_NAME = "prefs"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    Log.v("PrefsFragment", "Creating prefs fragment"); 

    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.prefs_xml); 

    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 

} 

void loadDefaults() { 

    SharedPreferences def = getActivity().getPreferences(0); 
    Log.v("Something", def.getString("relay1_name", "no")); 

} 

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

    if (key.equals("relay1_name")){ 
     Preference connectionPref = findPreference(key); 
     connectionPref.setSummary(sharedPreferences.getString(key, "")); 

} 

@Override 
public void onResume() { 
    super.onResume(); 
    getPreferenceScreen().getSharedPreferences() 
      .registerOnSharedPreferenceChangeListener(this); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    getPreferenceScreen().getSharedPreferences() 
      .unregisterOnSharedPreferenceChangeListener(this); 
} 

} 

回答

0

我覺得PreferenceScreen使用應用程序的默認共享優先權而您的片段正在使用getActivity().getPreferences()

在活動文檔中查看getPreferences(),它不檢索應用程序共享首選項,而是檢索特定活動專用的首選項。我認爲這與PreferenceScreen存儲的不一樣。

我可能會建議你用

SharedPreferences def = PreferenceManager.getDefaultSharedPreferences(); 

更換

SharedPreferences def = getActivity().getPreferences(0); 

,看看有沒有什麼幫助。

+0

Thankyou爲你的答案,不幸getSharedPreferences()沒有字,因爲它需要一個上下文作爲一個片段沒有的參數。然而,我確實解決了這個問題 - SharedPreferences def = getPreferenceScreen()。getSharedPreferences();直接訪問首選項屏幕的sharedPreferences。 –

相關問題