我想存储一个时间值,需要检索和编辑它.我SharedPreferences该怎么用呢?
我的代码是:
final String eulaKey = "mykey";
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
boolean hasBeenShown = prefs.getBoolean(eulaKey, false);
始终根据操作系统版本返回不同的值.在2.2,2.3.4,3.2,4.0.3中测试 - 返回正确的值.但对于带有CianogenMod 7.1的2.3.7设备Zte刀片 - 结果总是错误的.我想getBoolean的默认值.
这是编写boolean的代码:
final String eulaKey = "mykey";
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(eulaKey, true);
editor.commit();
有人有任何想法吗?
更新:将我当前的代码与我之前的代码版本进行比较 - 代码没有区别.唯一不同的是清单:代码工作正常minVersion = 8和targetVersion = 8现在我正在编译minversion = 8和target = 13 /因为Admob /.也许有些API改变了,但我没有发现这一点.
解决方案: - 从快捷方式启动应用程序,从菜单中为我提供不同的DefaultSharedPreferences.从我的代码中删除DefaultSharedPreferences后 - 它完美无缺.我不能只说:人们不做捷径,所以我不得不改变代码.
我只是好奇.有3种方法:
1. getPreferenceManager().setSharedPreferencesName(String PrefName);
2. PreferenceManager.getDefaultSharedPreferences(Context context)
3. Context.getSharedPreferences (String name, int mode)
据我所知,第三种方法仅在使用第一种方法时使用,对吧?但是我们也用3种方法addPreferencesFromResource(int resID); 那么区别是什么呢?我们什么时候可以使用这些方法之一?谢谢!
编辑: 下面描述的问题是由于一个非常奇怪的设备问题不是由任何编码相关的问题引起的.
我有一个preferenceActivity,其中有很多checkBoxPreferences.checkBoxPreference假设保存默认的共享首选项文件,然后在我打开应用程序时再次调用以更新UI.
这不会像它想象的那样发生.如果我关闭应用程序并将其重新打开,我的值仍然像他们想象的那样,但如果我使用任务管理器来结束应用程序,或者如果我重新启动手机(当应用程序未运行时),则调用defaultValues再次.
所以,我在onResume()中创建了一个SharedPreference来测试它.
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
然后我检查该共享首选项中是否有密钥.
pref.contains("myCheckBoxPreference");
当我关闭并重新打开它时,它返回true.如果我与任务管理器关闭或关闭和打开电话,则返回false.
所以,我尝试手动设置SharedPreference
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("myCheckBoxPreference", myCheckBoxPreference.isChecked());
editor.commit();
然后我在checkboxpreference值更改时调用了它.我也尝试在onStop和onPause中调用它.尽管如此,如果我关闭应用程序并将其重新打开,pref.contains将返回true,但如果我重新启动手机并重新打开,则返回false.
所以我尝试使用SharedPreferences文件.
在类声明中:
public static final String PREFS = "prefs";
在onResume()中:
SharedPreferences pref = this.getSharedPreferences(PREFS, 0);
同样的行为,如果我只是关闭应用程序并将其重新打开,pref.contains仍会返回true,但如果我关闭并重新打开手机,则返回false.
然后,我尝试myCheckBoxPreference的键值改变的东西,没有为CheckBoxPreference符合XML密钥,它仍然有同样的效果.
我从手机上卸下了应用程序,然后打开电源并重新打开,然后重新安装,它仍然具有相同的效果.
android taskmanager preference preferenceactivity sharedpreferences
我在同步成功后在SyncAdapter中更改并提交SharedPreference,但是当我在Activity中访问首选项时,我没有看到更新的值(相反,我看到的是旧值).我究竟做错了什么?不同的上下文?
我在SyncAdapter中更新首选项:
class SyncAdapter extends AbstractThreadedSyncAdapter {
    private int PARTICIPANT_ID;
    private final Context mContext;
    private final ContentResolver mContentResolver;
    public SyncAdapter(Context context, boolean autoInitialize) {
        super(context, autoInitialize);
        mContext = context;
        mContentResolver = context.getContentResolver();
    }
    public SyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSyncs) {
        super(context, autoInitialize, allowParallelSyncs);
        mContext = context;
        mContentResolver = context.getContentResolver();
    }
    @Override
    public void onPerformSync(Account account, Bundle extras, String authority,
                              ContentProviderClient provider, SyncResult syncResult) {
        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
        PARTICIPANT_ID = Integer.parseInt(prefs.getString("participant_id", "0"));
        if (success) {
            // save and …这是我用来在首选项中创建和存储值的代码。传出是字符串变量。
SharedPreferences sp = getSharedPreferences(outgoing, Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();                
editor.putString("PhoneNo","Hi");
editor.commit();
这是从 SharedPreference 获取值的代码。
SharedPreferences sp 
=getSharedPreferences(outgoing,Activity.MODE_PRIVATE);
String calln = sp.getString("PhoneNo","0");
Toast.makeText(mContext, "SHARED"+calln,Toast.LENGTH_LONG).show();
这是一个标准任务:在应用程序的共享首选项中存储一些值,以便以后能够检索它.但是人们会发现有3个函数可以在那里存储一个值:
//1.
public static SharedPreferences PreferenceManager.getDefaultSharedPreferences(Context context) {}
//2.
public SharedPreferences Activity.getPreferences(int mode) {}
//3.
public SharedPreferences ContextWrapper.getSharedPreferences(String name, int mode) {}
所以现在问题是:选择哪一个,哪一个更好,或者每个人的目的是什么?
我已经设置了PreferenceFragment两个布尔首选项.在Fragment当应用程序被关闭并重新打开,做工精细和设置存储.但是,在尝试阅读这些值时,我遇到了问题; 仅返回默认值.如果我调试getBoolean方法,SharedPreferences我看到本地HashMap的大小为0,因此返回默认值,如下所示:
public boolean getBoolean(String key, boolean defValue) {
    synchronized (this) {
        awaitLoadedLocked();
        Boolean v = (Boolean)mMap.get(key); // <-- mMap is of size 0: return defValue
        return v != null ? v : defValue;
    }
}
我发现这很奇怪,因为偏好值显然是存储并正确加载到PreferenceFragment.我错过了什么?
在Activity.onCreate():
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
RES/XML /的preferences.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory
        android:key="mm_preferences_category_recipe_preferences"
        android:title="@string/mm_preferences_category_recipe_preferences_title" >
        <CheckBoxPreference
            android:key="@string/mm_preferences_numbers_as_fractions_key"
            android:title="@string/mm_preferences_numbers_as_fractions_title"
            android:summary="@string/mm_preferences_numbers_as_fractions_summary"
            android:defaultValue="true" />
        <CheckBoxPreference
            android:key="@string/mm_preferences_comma_as_decimal_separator_key"
            android:title="@string/mm_preferences_comma_as_decimal_separator_title"
            android:summary="@string/mm_preferences_comma_as_decimal_separator_summary"
            android:defaultValue="true" />
    </PreferenceCategory>
</PreferenceScreen> …PreferenceManager.getDefaultSharedPreferences(context)
和
getPreferences()
似乎检索不同的首选项.
PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
                        "userWasAskedToEnableGps", false);
对我来说,返回false,
getPreferences(MODE_PRIVATE).getBoolean("userWasAskedToEnableGps", false);
返回true.
Preference是用编辑器编写的
Editor e = getPreferences(MODE_PRIVATE).edit(); 
e.putBoolean (...);
e.commit();
如何在Context中的Activity之外获得相同的Preferences?
能否请您告诉我如何使用共享首选项在共享首选项文件中写入多个条目。就像我想在共享首选项文件中添加多个名称一样,我正在使用以下代码,但是每次单击提交按钮时,它都会覆盖上一个条目。
public void onClick(View v) 
{           
    SharedPreferences settings = getSharedPreferences("users", 0);
    SharedPreferences.Editor editorUser = settings.edit();
    editorUser.putString("user", editUser.getText().toString());
    editorUser.commit();
}
编辑:提供的“重复”不能解决我的问题,因为它没有完全回答我的问题。(关于第二个参数的信息丢失)。
这个问题旨在为新的Android开发人员清除信息,而不是解决我自己的问题。请重新考虑否决票。
所以,这是方法:
getSharedPreferences(string, Context.MODE_PRIVATE);
我真的无法理解第一个参数的作用。它有什么作用?如果我们保存东西时SharedPreferences使用密钥,为什么会有第一个参数?