Android 如何从 SharedPreference 设置 EditTextPreference 的默认值?

Posted

技术标签:

【中文标题】Android 如何从 SharedPreference 设置 EditTextPreference 的默认值?【英文标题】:Android how to set default value of EditTextPreference from SharedPreference? 【发布时间】:2015-04-07 15:15:48 【问题描述】:

这次在同一个项目中,我面临一个稍微具有挑战性的问题,在 res/xml 文件夹中的 settings.xml 文件中:

<EditTextPreference
    android:key="weight" 
    android:title="@string/update_user_weight"
    android:persistent="true"
    android:dialogTitle="@string/update_user_weight"
    android:dialogMessage="@string/update_user_weight_message"
    android:defaultValue="" />

<EditTextPreference
    android:key="age"
    android:title="@string/update_user_age"
    android:persistent="true"
    android:dialogTitle="@string/update_user_age"
    android:dialogMessage="@string/update_user_age_message"
    android:defaultValue="" />

在类文件UserData.java中:

SharedPreferences storeWeightAndAge = getSharedPreferences("WeightAndAgeStorage", Context.MODE_PRIVATE);
Editor store = storeWeightAndAge.edit();
store.putString("weight", weightData);
store.putString("age", ageData);
store.commit();

我在这里要做的是将上述两个EditTextPreferences的android:defaultValue分别设置为存储在SharedPreferences中的weightage

现在,我该怎么做呢?

编辑:提供了使用 settings.xml 文件的 Settings.java 文件:

package com.example.drinkup;

import android.content.SharedPreferences;
import android.os.*;
import android.preference.PreferenceFragment;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class Settings extends PreferenceActivity 
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);



    


【问题讨论】:

你想从代码中设置 android:defaultValue 吗? @Rami 如果只能通过代码实现,当然可以。但是如果xml可以帮助自己找到它,那就更好了。喜欢:@strings/.... 等等等等……类似的东西。 在xml中,你可以通过:android:defaultValue="YOUR_DEFAULT_VALUE"。请注意,您从 strings.xml android:defaultValue="@strings/....". 获取默认值 @Rami 哦,不,我不打算从 strings.xml 设置默认值,我只是想举一个例子,以与 strings.xml 类似的方式设置默认值.我想将默认值设置为我存储在SharedPreferences 中的字符串,它们的键是"weight""age" 【参考方案1】:

好的,伙计们,我明白了:

import android.preference.EditTextPreference;

public class Settings extends PreferenceActivity 


    EditTextPreference weightEditTextPreference;
    EditTextPreference ageEditTextPreference;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);

        weightEditTextPreference = (EditTextPreference)findPreference("weight");
        ageEditTextPreference = (EditTextPreference)findPreference("age");

        SharedPreferences getWeightAndAgeStore = getSharedPreferences("weightAndAgeStorage", Context.MODE_PRIVATE);
        weightEditTextPreference.setText(getWeightAndAgeStore.getString("weight", "0"));
        ageEditTextPreference.setText(getWeightAndAgeStore.getString("age", "0"));

它的作用是在按下它时弹出的对话框中将 EditText 框设置为 SharedPreferences' 保存的键(在本例中为 weightageWeightAndAgeStorage)数据。

希望现在或将来阅读本文的其他人(但过去呢?)从这一发现中受益。

干杯!

【讨论】:

@Rami 不能,只能在添加后的第二天接受。 @Rami 感谢您的尝试!【参考方案2】:

首先,设置EditTextPreference的默认值。该值将存储为String 类型。例如:

<EditTextPreference
    android:key="weight"
    android:defaultValue="enter your value (54)"
    ... />

<EditTextPreference
    android:key="age"
    android:defaultValue="enter your value"
    ... />

然后,在您的应用活动首先启动的活动中应用默认值(首先安装一次)。比如在MainActivityonCreate()方法中:

PreferenceManager.setDefaultValue(this, R.xml.settings, false);

【讨论】:

好吧,我刚刚试过这个,但它似乎不起作用。文本在editTextPreference 中显示为weightData,而不是真正保存的重量,它是一个编号字符串 (54)。 您可以将 weightData 更改为您的值(即 54)。先看编辑。但是,最好在首选项中创建一个NumberPicker,将数据保存为int(编号值),因为EditTextPreference 始终将数据保存为String 值。 记住: String 不能用于数学,但int 可以。 感谢您的帮助。我也找到了办法。【参考方案3】:

您所要做的就是使用 sharedPreferences.getString() ,然后使用 editext.setText() 。

【讨论】:

您能否进一步说明如何执行此操作以及它是如何工作的?

以上是关于Android 如何从 SharedPreference 设置 EditTextPreference 的默认值?的主要内容,如果未能解决你的问题,请参考以下文章

SharedPreferences 和线程安全

实现用户选择主题

如何从 Android 版本 Marshmallow 开始请求从 Android 拨打电话的权限?

如何从Android调用javascript?

android: 如何从 Android Support Lib 版本 4 向 PagerTabStrip 添加图标/drawables?

Android:从片段调用时如何从活动中获取返回结果?