web-dev-qa-db-fra.com

Définition du champ Résumé de la préférence de l'UI à la valeur de la préférence

Nouveau à Android, j'ai du code lorsque l'utilisateur modifie une préférence que je mettez à jour le champ Résumé de la préférence de l'interface utilisateur pour être la valeur qu'elles entrées. Toutefois, lorsque l'activité de préférence est créée, je voudrais définir les champs de résumé pour être les valeurs dans les préférences correspondantes. S'il vous plaît donnez votre avis. Merci.

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

Je suis nouveau aussi, alors peut ne pas être le meilleur code mais c'est semblable à ce que je fais. Vous voulez probablement vous inscrire à l'auditeur ONRESUME et le désenregistrer en Onpause plutôt que surCréate. J'espère que ça aide.

Principalement, il vous suffit de saisir la préférence, la valeur de Pref et définir le résumé.

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

Cela a fonctionné pour moi.

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

Ce que je fais habituellement est:
[.____] 1 - Faites une nouvelle classe qui étend le type de préférence que je dois montrer (1 par type de préférence) 2 - à l'intérieur de son code, effectuez l'actiab approprié pour afficher le résumé mis à jour
[.____] 3 - renvoyer cette classe dans le fichier res/xml/préférences.xml fichier

[.____] Permettez-moi de swo un petit exemple, bon pour une éditexprefreence:

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/préférences.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>

Bien sûr, définissez vos chaînes dans/Res/Valeurs/Strings, et vous avez terminé.

[.____] Notez que Cette solution fonctionne pour les fragments de préférence et les préférences.
[.____] Je l'utilise pour une application THA fonctionne sur 2,2 Froyo (montrant une préférence) ainsi que sur 4,4 kitkat (montrant un fragment préférant)

[.____] J'espère que ça vous aide.

1
Phantômaxx

Premièrement, pour votre classe:

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

Ensuite, dans le onSharedPreferenceChanged, vous avez une référence à la transmission partagée, que vous pouvez utiliser pour obtenir le résultat de la préférence. Ensuite, vous pouvez utiliser le dernier résultat que vous obtenez pour modifier le résumé:

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