web-dev-qa-db-ja.com

UI設定の「要約」フィールドを設定の値に設定する

Androidの新機能として、ユーザーが設定を変更したときに、UI設定の[Summary]フィールドをユーザーが入力した値に更新するコードがいくつかあります。ただし、preferenceアクティビティが作成されたら、Summaryフィールドを対応する設定の値に設定します。お知らせ下さい。ありがとう。

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

私も新しいので、最高のコードではないかもしれませんが、これは私がやっていることに似ています。 onCreateではなく、リスナーをonResumeに登録し、onPauseの登録を解除する必要があります。これがお役に立てば幸いです。

主に、設定、設定値を取得し、概要を設定するだけです。

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

これでうまくいきました。

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

私がいつもやっていることは:
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を表示)で実行するアプリに使用しています。

お役に立てば幸いです。

1
Phantômaxx

まず、あなたのクラスのために:

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