【问题标题】:Why is this preference not being saved?为什么这个偏好没有被保存?
【发布时间】:2014-08-01 17:30:24
【问题描述】:

据我所知,我在获取时使用与设置时相同的键,但首选项并未保存。我确定我遗漏了一些明显的东西。

我的自定义 DialogPreference 我在其中加载当前首选项并设置新首选项。

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();
    }
}

我的 PreferenceScreen 的 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>

另外,我不明白为什么examples online 不包含getSharedPreferences() 中的参数。我认为这就是 android 知道要使用哪个文件的方式。

【问题讨论】:

  • 您发布的代码仅显示 阅读 SharedPreferences - 您在哪里写入?
  • 在 onDialogClosed 我有editor.putInt(semester_id_key, newId)

标签: android android-preferences android-settings


【解决方案1】:

这里是write to SharedPreferences的方法:

    public static final String PREFS_NAME   = "UNIQUE-NAME"; // settings will be saved here 

    // ...       
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    Editor editor = settings.edit();
    editor.putString("abc", "123");
    editor.commit();

如果您遇到以下错误:

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);

你可以这样做:

SharedPreferences settings = getActivity().getPreferences(PREFS_NAME, 0);

如果你想从不同的活动中接近它,那么做:

SharedPreferences settings = getSharedPreferences(YourBaseActivity.PREFS_NAME, 0);

(不用说,您应该将YourBaseActivity 替换为您在其中声明SharedPreferences 开头的活动的名称)。

【讨论】:

  • 这是对我有用的解决方案!谢谢。此外,我显然让我的主要活动重置了此首选项,因此其他解决方案之一也可能有效。
【解决方案2】:

参考http://developer.android.com/guide/topics/data/data-storage.html

这样做:

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
  SharedPreferences.Editor editor = settings.edit();
  editor.putBoolean("silentMode", mSilentMode);

  // Commit the edits!
  editor.commit();

【讨论】:

  • 我认为这在 DialogPreference 中不起作用。使用该版本的getSharedPreferences 会给我一个错误。 Preference类型中的getSharedPreferences()方法不适用于参数(String, int)
【解决方案3】:

你需要这样调用编辑器:

...

View view;
SharedPreferences settings;
SharedPreferences.Editor editor;

...

然后在下一部分:

settings = PreferenceManager.getDefaultSharedPreferences(this); // if this doesnt work, try getApplicationContext()

editor = settings.edit();
editor.putInt(semester_id_key, newId);
editor.commit();

注意:

建议尽可能使用apply() 而不是commit(),因为它是异步的,但两者都可以。

【讨论】:

  • 谢谢。我按照您的建议将视图、设置和编辑器声明为字段。我按照您的建议在onBindDialogView 中使用 PreferenceManager 初始化了设置。在onDialogClosed 中,我按照您的建议使用了编辑器字段。现在我在putInt 行上得到一个 NullPointerException :(
猜你喜欢
  • 2017-02-20
  • 2014-01-07
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多