将UI偏好设置摘要字段设置为偏好值

26

我是Android新手,当用户更改喜好设置时,我有一些代码会更新UI喜好设置中“摘要”字段的值为他们输入的值。然而,当喜好设置活动被创建时,我想将“摘要”字段设置为相应喜好设置中的值。
请指导。谢谢。

public class MyPreferenceActivity extends PreferenceActivity implements
        OnSharedPreferenceChangeListener {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preference);
        SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
        sp.registerOnSharedPreferenceChangeListener(this);
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        Preference pref = findPreference(key);
        if (pref instanceof EditTextPreference) {
            EditTextPreference etp = (EditTextPreference) pref;
            pref.setSummary(etp.getText());
        }
    }
}

4个回答

50

我也是新手,所以可能不是最好的代码,但这与我正在做的事情类似。 你可能想在 onResume 中注册监听器并在 onPause 中注销它,而不是在 onCreate 中。希望这可以帮助你。

主要的是,你只需要获取 pref、pref 值并设置摘要。

public class MyPreferenceActivity extends PreferenceActivity implements
        OnSharedPreferenceChangeListener {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preference);
        SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
        EditTextPreference editTextPref = (EditTextPreference) findPreference("thePrefKey");
        editTextPref
                .setSummary(sp.getString("thePrefKey", "Some Default Text"));
    }

    protected void onResume() {
        super.onResume();
        getPreferenceScreen().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(this);
    }

    protected void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences()
                .unregisterOnSharedPreferenceChangeListener(this);
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        Preference pref = findPreference(key);
        if (pref instanceof EditTextPreference) {
            EditTextPreference etp = (EditTextPreference) pref;
            pref.setSummary(etp.getText());
        }
    }
}

对我来说它正常工作。它仅在值更改时触发。因此,如果您的设置已经包含值,则需要在onCreated中预设摘要。 SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); String email = sharedPreferences.getString("prefUsername", "NULL"); EditTextPreference prefUsername = (EditTextPreference)findPreference("prefUsername"); prefUsername.setSummary(email); - yancyn
问题:为什么这个答案(以及原始问题)要转换为EditTextPreferencesetSummaryPreference的一个方法。有特定的原因需要进行转换吗?我只是想理解一下。 - Gary Sheppard
2
@GaryS。getText()方法在Preference中不可用。 - nhaarman
谢谢,@NiekHaarman。我没有注意到onSharedPreferenceChanged中的转换。我是在提到onCreate中的转换。我猜那里的转换不是必要的。 - Gary Sheppard

7
这对我有用。
public class PrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener
{
    private Preference pref;
    private String summaryStr;
    String prefixStr;

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

       SharedPreferences sharedPref = getPreferenceScreen().getSharedPreferences();
       sharedPref.registerOnSharedPreferenceChangeListener(this);      
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
    {
        //Get the current summary
        pref = findPreference(key);
        summaryStr = (String)pref.getSummary();

        //Get the user input data
        prefixStr = sharedPreferences.getString(key, "");

        //Update the summary with user input data
        pref.setSummary(summaryStr.concat(": [").concat(prefixStr).concat("]"));
    }
}   

1
我通常做的是:
1 - 创建一个新类,该类扩展了我需要显示的首选项类型(每种首选项类型一个) 2 - 在其代码内,执行适当的操作以显示更新后的摘要
3 - 在 res/xml/preferences.xml 文件中引用此类

让我展示一个小例子,适用于 EditTextPreference:

CLS_Prefs_Edit.java
/**
 * CLS_Prefs_Edit class
 *
 * This is the class that allows for a custom EditTextPrefence
 * (auto refresh summary).
 *
 * @category    Custom Preference
 * @author        Luca Crisi (luca.crisi.lc@gmail.com)
 * @copyright    Luca Crisi
 * @version        1.0
 */
package com.your_name.your_app;

/* -------------------------------- Imports --------------------------------- */

import android.content.Context;
import android.preference.EditTextPreference;
import android.util.AttributeSet;

public final class CLS_Prefs_Edit
extends EditTextPreference
{

    /* ---------------------------- Constructors ---------------------------- */

    public CLS_Prefs_Edit(final Context ctx, final AttributeSet attrs)
    {
        super(ctx, attrs);
    }
    public CLS_Prefs_Edit(final Context ctx)
    {
        super(ctx);
    }

    /* ----------------------------- Overrides ------------------------------ */

    @Override
    public void setText(final String value)
    {
        super.setText(value);
        setSummary(getText());
    }
}

res/xml/preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <PreferenceCategory android:title="@string/pref_phone_cat">
<!-- NORMAL EditTextPreference, NO summary update -->
<!--         <EditTextPreference -->
<!--             android:widgetLayout="@layout/arr_dn" -->
<!--             android:key="phone" -->
<!--             android:title="@string/pref_phone_title" -->
<!--             android:summary="@string/pref_phone_summ" -->
<!--             android:defaultValue="" -->
<!--             android:inputType="phone" -->
<!--             android:digits="+1234567890" -->
<!--         /> -->
<!-- MY EditTextPreference, WITH summary update -->
        <com.your_name.your_app.CLS_Prefs_Edit
            android:widgetLayout="@layout/arr_dn"
            android:key="phone"
            android:title="@string/pref_phone_title"
            android:summary="@string/pref_phone_summ"
            android:defaultValue=""
            android:inputType="phone"
            android:digits="+1234567890"
        />
    </PreferenceCategory>
</PreferenceScreen>

当然,将您的字符串设置在/res/values/strings中,然后您就完成了。

请注意此解决方案适用于PreferenceFragments和PreferenceActivities
我正在使用它来开发一个应用程序,在2.2 Froyo(显示PreferenceActivity)和4.4 KitKat(显示PreferenceFragment)上运行。

希望这有所帮助。

虽然这样可以工作,但它会在setText()和setSummary()之间引入不良依赖关系。例如,Android框架可以决定在调用setText()后使用空字符串(从xml中应用值)来调用setSummary()。 - wonder.mice

0

首先,针对你的类:

class SettingsFragment : SettingsBaseFragment(),
    // Make sure you implement the OnSharedPreferenceChangeListener
    SharedPreferences.OnSharedPreferenceChangeListener,
    Preference.OnPreferenceClickListener {}

下一步,在onSharedPreferenceChanged中,您将拥有对共享首选项的引用,可以使用它来获取首选项结果。然后,您可以使用您获得的最新结果来更改摘要:
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
        when (key) {
            SETTINGS_AUTO_SETTLEMENT -> refreshSummaryForAutoSettlement(sharedPreferences?.getBoolean(SETTINGS_AUTO_SETTLEMENT, false))
        }
    }

// helper function for altering the summary for the preference
private fun refreshSummaryForAutoSettlement(isAutoSettlementEnabled: Boolean?) {
    when (isAutoSettlementEnabled != null && isAutoSettlementEnabled) {
        true -> findPreference(SETTINGS_AUTO_SETTLEMENT).summary = getString(R.string.auto_settlement_enabled_summary)
        false -> findPreference(SETTINGS_AUTO_SETTLEMENT).summary = getString(R.string.auto_settlement_disabled_summary)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接