Android 为什么不保存此首选项?
据我所知,我在获取和设置时使用相同的键,但首选项没有保存。我肯定我错过了一些明显的东西 我的自定义对话框首选项,其中我加载当前首选项并设置新的首选项Android 为什么不保存此首选项?,android,android-preferences,android-settings,Android,Android Preferences,Android Settings,据我所知,我在获取和设置时使用相同的键,但首选项没有保存。我肯定我错过了一些明显的东西 我的自定义对话框首选项,其中我加载当前首选项并设置新的首选项 public class SemesterDialogPreference extends DialogPreference { View view; SharedPreferences settings; String semester_id_key = this.getContext().getApplicationC
public class SemesterDialogPreference extends DialogPreference {
View view;
SharedPreferences settings;
String semester_id_key = this.getContext().getApplicationContext().getString(R.string.pref_semester_id);
DBAdapter db;
@Override
public void onBindDialogView(View view){
this.view = view;
settings = getSharedPreferences();
int curSemesterId = settings.getInt(semester_id_key, 1);
System.out.println("Incoming " + semester_id_key + " equals " + curSemesterId);
// Here I do stuff...
super.onBindDialogView(view);
}
public SemesterDialogPreference(Context context, AttributeSet attrs) {
super(context, attrs);
setDialogLayoutResource(R.layout.dialog_set_semester);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
// Do things and set newId
System.out.println("new int for " + semester_id_key + " is " + newId);
Editor editor = getEditor();
editor.putInt(semester_id_key, newId);
editor.commit();
}
}
“我的首选项”屏幕的XML
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="@string/pref_header_settings" >
<com.NsouthProductions.gradetrackerpro.SemesterDialogPreference
android:title="@string/pref_title_semester"
android:summary="@string/pref_summary_semester"
android:key="@string/pref_semester_id"
android:dialogMessage="Are you sure?"
android:positiveButtonText="Clear Questss"
android:negativeButtonText="Cancel"/>
</PreferenceCategory>
</PreferenceScreen>
另外,我不明白为什么不在getSharedReferences()
中包含参数。我想这就是android知道使用哪个文件的原因。参考
像这样做:
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Commit the edits!
editor.commit();
您需要这样调用编辑器: 然后在下一部分:
settings = PreferenceManager.getDefaultSharedPreferences(this); // if this doesnt work, try getApplicationContext()
editor = settings.edit();
editor.putInt(semester_id_key, newId);
editor.commit();
注意:
建议尽可能使用apply()
而不是commit()
,因为它是异步的,但两者都可以工作。以下是如何:
如果您在以下方面出现错误:
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
你可以做:
SharedPreferences settings = getActivity().getPreferences(PREFS_NAME, 0);
如果您试图从不同的活动着手,请执行以下操作:
SharedPreferences settings = getSharedPreferences(YourBaseActivity.PREFS_NAME, 0);
(不用说,你应该用你声明
SharedReferences
的活动名称替换YourBaseActivity
。你发布的代码只显示了对SharedReferences
的读取-你在哪里写入它?在onDialogClosed中,我有editor.putInt(Semmer\u id\u key,newId)
。我认为这在DialogPreference中不起作用。使用该版本的GetSharedReferences
会给我一个错误。类型首选项中的方法GetSharedReferences()不适用于参数(String,int)谢谢。我按照您的建议将视图、设置和编辑器声明为字段。我按照您的建议在onBindDialogView
中使用PreferenceManager初始化了设置。在onDialogClosed
中,我按照您的建议使用了编辑器字段。现在我在Putin
行上得到了一个NullPointerException:(这是对我有效的解决方案!谢谢。而且,我的主要活动显然是重置了此偏好,因此其他解决方案中的一个也可能有效。
SharedPreferences settings = getActivity().getPreferences(PREFS_NAME, 0);
SharedPreferences settings = getSharedPreferences(YourBaseActivity.PREFS_NAME, 0);