【问题标题】:onSharedPreferenceChanged without using getDefaultSharedPreferencesonSharedPreferenceChanged 不使用 getDefaultSharedPreferences
【发布时间】:2012-11-08 10:08:08
【问题描述】:

我正在使用 context.getSharedPreference 而不是 getDefaultSharedPreferences。 意思是:

SharedPreferences checkboxSetting = context.getSharedPreferences(
                                         "myPreferenceDB", Context.MODE_PRIVATE);
boolean flag = checkboxSetting.getBoolean("checkboxKey",true);

还有preference.xml:

<CheckBoxPreference 
        android:key="checkBoxPrefff"
        android:title="@string/title"
        android:defaultValue="true"/>

应用程序设置有一个复选框首选项,我想获取它的值,选中或未选中。

这行得通吗?

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                                                                      String key) {
    if (key.equalsIgnoreCase("checkBoxPrefff")) { 
         sharedPreferences.getBoolean(key,true);
    }
 }

sharedPreferences 是使用默认数据库(..._preference.xml)还是我定义的数据库(“myPreferenceDB”)? 键是“checkboxKey”还是为空?

因为当我想获得像这样的价值时

SharedPreferences temp = context.getSharedPreferences(
                                         "myPreferenceDB", Context.MODE_PRIVATE);
boolean flag = temp.getBoolean("checkboxKey",true);

这是错误的并返回 defValue (true) 。但是当使用like时

SharedPreferences temp = PreferenceManager.getDefaultSharedPreferences(context);
boolean flag = temp.getBoolean("checkboxKey",true);

它有效。

【问题讨论】:

  • "sharedPreferences 是使用默认数据库 ( ..._preference.xml ) 还是我定义的数据库 ("myPreferenceDB" )" - 这取决于您向函数传递的内容。也是您的密钥checkboxKeycheckBoxPrefff。还有equalsIgnoreCaseequalsIgnoreCase ?

标签: android android-preferences


【解决方案1】:

我想再次提及 sharedPref 不是一个 DB 而是一个 XML 文件。我希望您正在寻找以下代码。

public class SettingsActivity extends PreferenceActivity {

    /*
     * (non-Javadoc)
     * 
     * @see android.preference.PreferenceActivity#onCreate(android.os.Bundle)
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getPreferenceManager().setSharedPreferencesName("myPref"); 
        addPreferencesFromResource(R.xml.pref);
    }

【讨论】:

  • 谢谢,但是 sharedPreferences 是 DB ,典型的。顺便说一下,不推荐使用 getPreferenceManager 。用什么代替?
  • 2-如果我使用 setSharedPreferencesName 并更改默认名称,则无需手动添加值(例如:myPrefIns.edit().putString("myKey",valueeee).commit())?跨度>
  • getPreferenceManager() 从 API11 中被弃用。您只需要像屏幕这样的设置并希望将值存储在共享首选项中,然后您就不需要手动保存它。另请参阅-developer.android.com/reference/android/preference/…,我希望存储来自其他任何地方的值,例如任何其他活动/服务等,您必须手动进行。
  • 是的,我知道它从 11 开始被弃用,我将 minSdkVersion 设置为 5 。那么发生了什么?
  • 没什么。你试过实现这个吗?
【解决方案2】:

您可以在您正在使用的任何共享首选项上注册 SharedPreferenceChangedListener。它不必是默认的共享首选项。

getApplicationContext().getSharedPreferences("myPreferenceDB", 0).registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() {

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                String key) {
            // TODO Auto-generated method stub

        }
    });

【讨论】:

  • 谢谢,但这不是我的相关答案!我想知道 sharedPreferences 是使用默认数据库还是我定义的数据库?
  • onPreferenceChange 和 onSharedPreferenceChanged 有什么不同?
  • sharedPref 是一个 xml 文件,存储在 /data/data//files 目录下。你能告诉我你想达到什么目标吗?
  • 我想使用我自己的 sharedPref (不是默认名称)并且不写任何东西来插入值( edit().commit() ),只使用 addPreferencesFromResource(R.xml 。喜好);处理对数据库的所有值的插入和更新
猜你喜欢
  • 1970-01-01
  • 2012-03-12
  • 2019-11-11
  • 2012-06-02
  • 2011-07-20
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多