将 UI 首选项摘要字段设置为首选项的值

发布于 2024-09-25 08:13:56 字数 878 浏览 1 评论 0原文

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

New to Android, I have some code when the user changes a preference I update the Summary field in the UI preference to be the value they entered. However, when the preference activity is created I'd like to set the Summary fields to be the values in the corresponding preferences.
Please advise. Thanks.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

别想她 2024-10-02 08:13:56

我也是新手,所以可能不是最好的代码,但这与我正在做的类似。您可能想在 Resume 上注册侦听器并在 Pause 上取消注册,而不是在 Create 上。我希望这有帮助。

主要是你只需要获取首选项、首选项值并设置摘要。

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

I am new too so may not be the best code but this is similar to what I am doing. You probably want to register you listener onResume and unregister it onPause though rather than onCreate. I hope this helps.

Mainly you just need to grab the pref, the pref value and set the summary.

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());
        }
    }
}
黑白记忆 2024-10-02 08:13:56

这对我有用。

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

This worked for me.

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("]"));
    }
}   
恋你朝朝暮暮 2024-10-02 08:13:56

我通常做的是:
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 ([email protected])
 * @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)上运行的应用程序

我希望它有帮助。

What I usually do is:
1 - Make a new class which extends the kind of preference I need to show (1 per preference type)
2 - Inside its code, do the appropriate actiob to show the updated summary
3 - Refer this class in the res/xml/preferences.xml file

Let me swo a small example, good for an 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 ([email protected])
 * @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>

Of course, set your strings in /res/values/strings, and you're done.

Note that this solution works for both PreferenceFragments and PreferenceActivities.
I'm using it for an app tha runs on 2.2 Froyo (showing a PreferenceActivity) as well as on 4.4 KitKat (showing a PreferenceFragment)

I hope it helps.

我们只是彼此的过ke 2024-10-02 08:13:56

首先,对于您的类:

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

接下来,在 onSharedPreferenceChanged 中,您有一个对sharedPreference 的引用,您可以使用它来获取首选项结果。然后您可以使用获得的最新结果来更改摘要:

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

First, for your class:

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

Next, in the onSharedPreferenceChanged, you have a reference to the sharedPreference, which you can use to get the preference result. Then you can use the latest result you get to alter the summary:

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)
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文