user-interface toolbar - كيف يمكنني عرض القيمة الحالية لتفضيلات Android في ملخص التفضيل؟




example action (24)

هذا يجب أن يأتي في كثير من الأحيان.

عندما يقوم المستخدم بتحرير التفضيلات في تطبيق Android ، أود أن يتمكن من رؤية القيمة المحددة حاليًا للتفضيل في ملخص Preference .

مثال: إذا كان لدي إعداد تفضيل لـ "تجاهل الرسائل القديمة" الذي يحدد عدد الأيام التي تحتاج بعدها إلى تنظيف الرسائل. في PreferenceActivity أرغب في أن يراها المستخدم:

"تجاهل الرسائل القديمة" <- العنوان

"تنظيف الرسائل بعد x أيام" <- summary حيث x هي قيمة التفضيل الحالية

رصيد إضافي: اجعله قابلاً لإعادة الاستخدام ، لذلك يمكنني تطبيقه بسهولة على جميع التفضيلات الخاصة بي بغض النظر عن نوعه (بحيث يعمل مع EditTextPreference و ListPreference إلخ مع الحد الأدنى من الترميز).


Answers

إذا كنت ترغب فقط في عرض قيمة النص العادي لكل حقل كملخص له ، فيجب أن تكون الشفرة التالية هي الأسهل في الصيانة. لا يتطلب سوى اثنين من التغييرات (السطور 13 و 21 ، مع "التغيير هنا"):

package com.my.package;

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;

public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {

    private final String[] mAutoSummaryFields = { "pref_key1", "pref_key2", "pref_key3" }; // change here
    private final int mEntryCount = mAutoSummaryFields.length;
    private Preference[] mPreferenceEntries;

    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences_file); // change here
        mPreferenceEntries = new Preference[mEntryCount];
        for (int i = 0; i < mEntryCount; i++) {
            mPreferenceEntries[i] = getPreferenceScreen().findPreference(mAutoSummaryFields[i]);
        }
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onResume() {
        super.onResume();
        for (int i = 0; i < mEntryCount; i++) {
            updateSummary(mAutoSummaryFields[i]); // initialization
        }
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); // register change listener
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); // unregister change listener
    }

    private void updateSummary(String key) {
        for (int i = 0; i < mEntryCount; i++) {
            if (key.equals(mAutoSummaryFields[i])) {
                if (mPreferenceEntries[i] instanceof EditTextPreference) {
                    final EditTextPreference currentPreference = (EditTextPreference) mPreferenceEntries[i];
                    mPreferenceEntries[i].setSummary(currentPreference.getText());
                }
                else if (mPreferenceEntries[i] instanceof ListPreference) {
                    final ListPreference currentPreference = (ListPreference) mPreferenceEntries[i];
                    mPreferenceEntries[i].setSummary(currentPreference.getEntry());
                }
                break;
            }
        }
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        updateSummary(key);
    }

}

هذه هي الكود الذي تحتاجه لتعيين الملخص للقيمة المختارة. كما يحدد القيم عند بدء التشغيل ويحترم القيم الافتراضية ، وليس فقط على التغيير. ما عليك سوى تغيير "R.layout.prefs" إلى ملف xml الخاص بك وتوسيع طريقة setSummary لاحتياجاتك. هو في الواقع التعامل مع ListPreferences فقط ، ولكن من السهل تخصيص احترام التفضيلات الأخرى.

package de.koem.timetunnel;

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;

public class Prefs 
    extends PreferenceActivity 
    implements OnSharedPreferenceChangeListener {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       this.addPreferencesFromResource(R.layout.prefs);
       this.initSummaries(this.getPreferenceScreen());

       this.getPreferenceScreen().getSharedPreferences()
           .registerOnSharedPreferenceChangeListener(this);
    }

  /**
    * Set the summaries of all preferences
    */
  private void initSummaries(PreferenceGroup pg) {
      for (int i = 0; i < pg.getPreferenceCount(); ++i) {
          Preference p = pg.getPreference(i);
          if (p instanceof PreferenceGroup)
              this.initSummaries((PreferenceGroup) p); // recursion
          else
              this.setSummary(p);
      }
  }

  /**
    * Set the summaries of the given preference
    */
  private void setSummary(Preference pref) {
      // react on type or key
      if (pref instanceof ListPreference) {
          ListPreference listPref = (ListPreference) pref;
          pref.setSummary(listPref.getEntry());
      }
  }

  /**
    * used to change the summary of a preference
    */
  public void onSharedPreferenceChanged(SharedPreferences sp, String key) {
     Preference pref = findPreference(key);
     this.setSummary(pref);
  }

  // private static final String LOGTAG = "Prefs";
}

koem


My solution is to create a custom EditTextPreference , used in XML like this: <com.example.EditTextPreference android:title="Example Title" />

EditTextPreference.java :-

package com.example;

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

public class EditTextPreference extends android.preference.EditTextPreference
{
    public EditTextPreference(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public EditTextPreference(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public EditTextPreference(Context context)
    {
        super(context, null);
    }

    @Override
    protected void onDialogClosed(boolean positiveResult)
    {
        super.onDialogClosed(positiveResult);

        setSummary(getSummary());
    }

    @Override
    public CharSequence getSummary()
    {
        return getText();
    }
}

هنا هو حل العامل لجميع EditTextPreferenceق داخل PreferenceFragmentالإجابة على أساسtdeveaux:

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
    private static final String TAG = "SettingsFragment";

    @Override
    public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onResume () {
        super.onResume();

        for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); ++i) {
            Preference preference = getPreferenceScreen().getPreference(i);
            updatePreference(preference);
        }
    }

    @Override
    public void onSharedPreferenceChanged (SharedPreferences sharedPreferences, String key) {
        updatePreference(findPreference(key));
    }

    private void updatePreference (Preference preference) {
        if (preference instanceof EditTextPreference) {
            EditTextPreference editTextPreference = (EditTextPreference)preference;
            editTextPreference.setSummary(editTextPreference.getText());
        }
    }
}

تشير documentation Android إلى أنه يمكن للمرء استخدام علامة تنسيق سلسلة في getSummary() :

إذا كان الملخص يحتوي على علامة لتنسيق السلاسل فيه (أي "٪ s" أو "٪ 1 $ s") ، فسيتم استبدال قيمة الإدخال الحالية في مكانها.

ببساطة تحديد android:summary="Clean up messages after %s days" عملت ميزة android:summary="Clean up messages after %s days" في تعريف xml ListPreference بالنسبة لي.

ملاحظة: هذا يعمل فقط مع ListPreference .


لقد حلت المشكلة مع السليل التالي من ListPreference:

public class EnumPreference extends ListPreference {

    public EnumPreference(Context aContext, AttributeSet attrs) {
        super(aContext,attrs);
    }

    @Override
    protected View onCreateView(ViewGroup parent) {
        setSummary(getEntry());
        return super.onCreateView(parent);
    }

    @Override
    protected boolean persistString(String aNewValue) {
        if (super.persistString(aNewValue)) {
            setSummary(getEntry());
            notifyChanged();
            return true;
        } else {
            return false;
        }
    }
}

يبدو أن العمل بشكل جيد بالنسبة لي في 1.6 حتى 4.0.4.


To set the summary of a ListPreference to the value selected in a dialog you could use this code:

package yourpackage;

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

public class ListPreference extends android.preference.ListPreference {

    public ListPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);
        if (positiveResult) setSummary(getEntry());
    }

    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        super.onSetInitialValue(restoreValue, defaultValue);
        setSummary(getEntry());
    }
}

and reference the yourpackage.ListPreference object in your preferences.xml remembering to specify there your android:defaultValue as this triggers the call to onSetInitialValue() .

If you want you can then modify the text before calling setSummary() to whatever suits your application.


هنا ، يتم قطع كل هذه من عينة Eclipse SettingsActivity . لا بد لي من نسخ كل هذه الرموز الكثير لإظهار كيف يختار هؤلاء مطوري الروبوت تماما لأسلوب الترميز أكثر عمومية ومستقرة.

لقد تركت الرموز لتكييف PreferenceActivity مع الجهاز اللوحي وواجهة برمجة التطبيقات (API) الأكبر.

public class SettingsActivity extends PreferenceActivity {

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    setupSummaryUpdatablePreferencesScreen();
}

private void setupSummaryUpdatablePreferencesScreen() {

    // In the simplified UI, fragments are not used at all and we instead
    // use the older PreferenceActivity APIs.

    // Add 'general' preferences.
    addPreferencesFromResource(R.xml.pref_general);

    // Bind the summaries of EditText/List/Dialog preferences to
    // their values. When their values change, their summaries are updated
    // to reflect the new value, per the Android Design guidelines.
    bindPreferenceSummaryToValue(findPreference("example_text"));
    bindPreferenceSummaryToValue(findPreference("example_list"));
}

/**
 * A preference value change listener that updates the preference's summary
 * to reflect its new value.
 */
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {

    private String TAG = SettingsActivity.class.getSimpleName();

    @Override
    public boolean onPreferenceChange(Preference preference, Object value) {
        String stringValue = value.toString();

        if (preference instanceof ListPreference) {
            // For list preferences, look up the correct display value in
            // the preference's 'entries' list.
            ListPreference listPreference = (ListPreference) preference;
            int index = listPreference.findIndexOfValue(stringValue);

            // Set the summary to reflect the new value.
            preference.setSummary(
                index >= 0
                ? listPreference.getEntries()[index]
                : null);
        } else {
            // For all other preferences, set the summary to the value's
            // simple string representation.
            preference.setSummary(stringValue);
        }
        Log.i(TAG, "pref changed : " + preference.getKey() + " " + value);
        return true;
    }
};

/**
 * Binds a preference's summary to its value. More specifically, when the
 * preference's value is changed, its summary (line of text below the
 * preference title) is updated to reflect the value. The summary is also
 * immediately updated upon calling this method. The exact display format is
 * dependent on the type of preference.
 *
 * @see #sBindPreferenceSummaryToValueListener
 */

private static void bindPreferenceSummaryToValue(Preference preference) {
    // Set the listener to watch for value changes.
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

    // Trigger the listener immediately with the preference's
    // current value.
    sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
                                                             PreferenceManager
                                                             .getDefaultSharedPreferences(preference.getContext())
                                                             .getString(preference.getKey(), ""));
}

}

xml/pref_general.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

<!-- NOTE: EditTextPreference accepts EditText attributes. -->
<!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. -->
<EditTextPreference
android:capitalize="words"
android:defaultValue="@string/pref_default_display_name"
android:inputType="textCapWords"
android:key="example_text"
android:maxLines="1"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/pref_title_display_name" />

<!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog todismiss it.-->
<!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
<ListPreference
android:defaultValue="-1"
android:entries="@array/pref_example_list_titles"
android:entryValues="@array/pref_example_list_values"
android:key="example_list"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_add_friends_to_messages" />

</PreferenceScreen>

values/strings_activity_settings.xml

<resources>
<!-- Strings related to Settings -->

<!-- Example General settings -->

<string name="pref_title_display_name">Display name</string>
<string name="pref_default_display_name">John Smith</string>

<string name="pref_title_add_friends_to_messages">Add friends to messages</string>
<string-array name="pref_example_list_titles">
<item>Always</item>
<item>When possible</item>
<item>Never</item>
</string-array>
<string-array name="pref_example_list_values">
<item>1</item>
<item>0</item>
<item>-1</item>
</string-array>
</resources>

NOTE: Actually I just want to comment like "Google's sample for PreferenceActivity is also interesting". But I haven't enough reputation points.So please don't blame me.

(Sorry for bad English)


إذا كان شخص ما لا يزال يبحث عن إجابات لهذا ، يجب عليك التحقق من إجابة thirtythreeforty .

<ListPreference
    android:key="pref_list"
    android:title="A list of preferences"
    android:summary="%s"
    android:entries="@array/pref_list_entries"
    android:entryValues="@array/pref_list_entries_values"
    android:defaultValue="0" />

سيستبدل Android٪ s بقيمة السلسلة الحالية للتفضيل ، كما هو معروض بواسطة منتقي ListPreference.


لقد رأيت جميع الإجابات التي تم التصويت عليها توضح كيفية تعيين الملخص بالقيمة الحالية بالضبط ، لكن OP أبدى أيضًا شيئًا من هذا القبيل:

"تنظيف الرسائل بعد x أيام" * <- ملخص حيث x هي قيمة التفضيل الحالية

هنا جوابي لتحقيق ذلك

كما تقول documentation حول ListPreference.getSummary() :

لعرض ملخص هذا ListPreference. إذا كان الملخص يحتوي على علامة لتنسيق السلاسل فيه (أي "٪ s" أو "٪ 1 $ s") ، فسيتم استبدال قيمة الإدخال الحالية في مكانها.

ومع ذلك ، حاولت على عدة أجهزة ولا يبدو أنها تعمل. مع بعض البحوث ، وجدت حلا جيدا في هذه الإجابة . إنه يتكون ببساطة من توسيع كل Preference تستخدمها وتجاوز getSummary() للعمل على النحو المحدد في وثائق Android.


لمعلوماتك:

findPreference(CharSequence key)
This method was deprecated in API level 11. This function is not relevant
for a modern fragment-based PreferenceActivity.

كل ذلك أكثر من سبب للنظر في Answer البقعة منASD أعلاه ( المصدر وجد هنا ) قائلا لاستخدام %s في android:summary لكل حقل في preferences.xml . (يتم استبدال القيمة الحالية للتفضيل بـ %s .)

<ListPreference
 ...        
 android:summary="Length of longest word to return as match is %s"
 ...
 />

public class ProfileManagement extends PreferenceActivity implements
OnPreferenceChangeListener {
    EditTextPreference screenName;
    ListPreference sex;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.layout.profile_management);

            screenName = (EditTextPreference) findPreference("editTextPref");
            sex = (ListPreference) findPreference("sexSelector");

            screenName.setOnPreferenceChangeListener(this);
            sex.setOnPreferenceChangeListener(this);

    }   

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        preference.setSummary(newValue.toString());
        return true;
    }
}

نظرًا لأنني أستخدم عادةً PreferenceDataStore، لا يمكنني إضافة مستمع إلى بعض ، SharedPreferenceلذلك اضطررت إلى كتابة حل غريب يستجيب لكل تفضيلات:

class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener {
    private val handler: Handler by lazy { Handler(Looper.getMainLooper()) }

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        preferenceManager.preferenceDataStore = prefs
        addPreferencesFromResource(R.xml.app_preferences)
        onPreferenceChange(preferenceScreen, null)
    }

    override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
        preference.onPreferenceChangeListener = this

        when (preference) {
            is PreferenceGroup -> for (i in 0 until preference.preferenceCount) {
                onPreferenceChange(preference.getPreference(i), null)
            }
            is ListPreference -> {
                if (preference.value == null) {
                    preference.isPersistent = false
                    preference.value = Preference::class.java.getDeclaredField("mDefaultValue")
                            .apply { isAccessible = true }
                            .get(preference).toString()
                    preference.isPersistent = true
                }

                postPreferenceUpdate(Runnable { preference.summary = preference.entry })
            }
        }
        return true
    }

    /**
     * We can't directly update the preference summary update because [onPreferenceChange]'s result
     * is used to decide whether or not to update the pref value.
     */
    private fun postPreferenceUpdate(r: Runnable) = handler.post(r)
}

إذا كنت تستخدم PreferenceFragment ، هذه هي الطريقة التي قمت بحلها. انها تفسيرية الذاتي.

public static class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      addPreferencesFromResource(R.xml.settings);
      getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onResume() {
      super.onResume();
      for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); ++i) {
        Preference preference = getPreferenceScreen().getPreference(i);
        if (preference instanceof PreferenceGroup) {
          PreferenceGroup preferenceGroup = (PreferenceGroup) preference;
          for (int j = 0; j < preferenceGroup.getPreferenceCount(); ++j) {
            Preference singlePref = preferenceGroup.getPreference(j);
            updatePreference(singlePref, singlePref.getKey());
          }
        } else {
          updatePreference(preference, preference.getKey());
        }
      }
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
      updatePreference(findPreference(key), key);
    }

    private void updatePreference(Preference preference, String key) {
      if (preference == null) return;
      if (preference instanceof ListPreference) {
        ListPreference listPreference = (ListPreference) preference;
        listPreference.setSummary(listPreference.getEntry());
        return;
      }
      SharedPreferences sharedPrefs = getPreferenceManager().getSharedPreferences();
      preference.setSummary(sharedPrefs.getString(key, "Default"));
    }
  }

يمكنك تجاوز فئات التفضيلات الافتراضية وتنفيذ الميزة.

public class MyListPreference extends ListPreference  {
    public MyListPreference(Context context) { super(context); }
    public MyListPreference(Context context, AttributeSet attrs) { super(context, attrs); }
    @Override
    public void setValue(String value) {
        super.setValue(value);
        setSummary(getEntry());
    }
}

لاحقًا في xml يمكنك استخدام تفضيلات مخصصة مثل

<your.package.name.MyListPreference 
    android:key="noteInterval"
    android:defaultValue="60"
    android:title="Notification Interval"
    android:entries="@array/noteInterval"
    android:entryValues="@array/noteIntervalValues"
    />

ربما مثل ListPreference: تعديل getSummary للحصول على ما تريد:

package your.package.preference;

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

public class EditTextPreference extends android.preference.EditTextPreference{
        public EditTextPreference(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

        public EditTextPreference(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public EditTextPreference(Context context) {
            super(context);
        }

        @Override
        public CharSequence getSummary() {
            if(super.getSummary() == null) return null;

            String summary = super.getSummary().toString();
            return String.format(summary, getText());
        }
    }

واستخدم هذا في xml الخاص بك:

<your.package.EditTextPreference
                android:key="pref_alpha"
                android:summary="Actual value: %s"
                android:title="Title"
                android:defaultValue="default"
                />

لذلك يمكنك كتابة ملخص بـ %s بدلاً من القيمة الفعلية.


بعد عدة ساعات قضيتها لحل هذه المشكلة قمت بتنفيذ هذا الكود:

[تحديث: قائمة الإصدار النهائي]

public class MyPreferencesActivity extends PreferenceActivity {
    ...
    ListPreference m_updateList;
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        m_updateList = (ListPreference) findPreference(getString(R.string.pref_update_interval_key));
        String currentValue = m_updateList.getValue();
        if (currentValue == null) {
            m_updateList.setValue((String)m_updateList.getEntryValues()[DEFAULT_UPDATE_TIME_INDEX]);
            currentValue = m_updateList.getValue();
        }
        updateListSummary(currentValue);    

        m_updateList.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                updateListSummary(newValue.toString());
                return true;
            }       
        });     
    }

    private void updateListSummary(String newValue) {
        int index = m_updateList.findIndexOfValue(newValue);
        CharSequence entry = m_updateList.getEntries()[index];
        m_updateList.setSummary(entry);
    }
}

كان هذا هو الحل الوحيد الذي يعمل معي بشكل جيد. قبل أن أحاول التصنيف الفرعي من ListPreferences وتطبيق android: summary = "bla bla bla٪ s". لا يعمل.


اختياري هو تمديد ListPreference وهو نظيف:

public class ListPreferenceShowSummary extends ListPreference {

    private final static String TAG = ListPreferenceShowSummary.class.getName();

    public ListPreferenceShowSummary(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ListPreferenceShowSummary(Context context) {
        super(context);
        init();
    }

    private void init() {

        setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference arg0, Object arg1) {
                arg0.setSummary(getEntry());
                return true;
            }
        });
    }

    @Override
    public CharSequence getSummary() {
        return super.getEntry();
    }
}

ثم تضيف في إعداداتك. xml:

<yourpackage.ListPreferenceShowSummary
    android:key="key" android:title="title"
    android:entries="@array/entries" android:entryValues="@array/values"
    android:defaultValue="first value"/>

شكرا على هذه النصيحة!

لدي شاشة تفضيل واحدة وأريد إظهار القيمة لكل تفضيل قائمة كملخص.

هذه هي طريقي الآن:

public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener {

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

@Override
protected void onResume() {
    super.onResume();

    // Set up initial values for all list preferences
    Map<String, ?> sharedPreferencesMap = getPreferenceScreen().getSharedPreferences().getAll();
    Preference pref;
    ListPreference listPref;
    for (Map.Entry<String, ?> entry : sharedPreferencesMap.entrySet()) {
        pref = findPreference(entry.getKey());
        if (pref instanceof ListPreference) {
            listPref = (ListPreference) pref;
            pref.setSummary(listPref.getEntry());
        }
    }

    // Set up a listener whenever a key changes            
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();

    // Unregister the listener whenever a key changes            
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);    
}

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference pref = findPreference(key);

    if (pref instanceof ListPreference) {
        ListPreference listPref = (ListPreference) pref;
        pref.setSummary(listPref.getEntry());
    }
}

هذا يعمل بالنسبة لي ، لكنني أتساءل ما هو الحل الأفضل (الأداء ، الاستقرار ، التدرجية): واحد Koem يظهر أو هذا واحد؟


هناك طرق لجعل هذا الحل أكثر عمومية ، إذا كان ذلك يناسب احتياجاتك.

على سبيل المثال ، إذا كنت ترغب في جعل جميع تفضيلات القائمة تظهر بشكل عام اختياراتها كملخص ، فيمكنك الحصول على ذلك لتطبيق onSharedPreferenceChanged :

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference pref = findPreference(key);

    if (pref instanceof ListPreference) {
        ListPreference listPref = (ListPreference) pref;
        pref.setSummary(listPref.getEntry());
    }
}

هذا قابل للتوسعة بسهولة إلى فئات التفضيل الأخرى.

وباستخدام وظيفة getPreference و getPreference في PreferenceScreen و PreferenceCategory ، يمكنك بسهولة كتابة وظيفة عامة للمشي على شجرة التفضيلات لتحديد ملخصات كل التفضيلات من الأنواع التي تريدها لتمثيلهم toString


شكرا ، ريتو ، للحصول على شرح مفصل!

في حالة وجود أي مساعدة لأي شخص ، كان علي تغيير الرمز الذي اقترحه Reto Meier لجعله يعمل مع SDK لنظام Android 1.5

@Override
protected void onResume() {
    super.onResume();

    // Setup the initial values
    mListPreference.setSummary("Current value is " + mListPreference.getEntry().toString()); 

    // Set up a listener whenever a key changes            
    ...
}

ينطبق نفس التغيير على وظيفة رد الاتصال على onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)

في صحتك،

كريس


You have to use bindPreferenceSummaryToValue function on the onCreate method.

مثال:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Add 'general' preferences, defined in the XML file
        addPreferencesFromResource(R.xml.pref_general);

        // For all preferences, attach an OnPreferenceChangeListener so the UI summary can be
        // updated when the preference changes.
        bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_location_key)));
        bindPreferenceSummaryToValue(findPreference(getString(R.string.pref_units_key)));
    }

See lesson 3 on Udacity Android Course: https://www.udacity.com/course/viewer#!/c-ud853/l-1474559101/e-1643578599/m-1643578601


ببساطة:

listPreference.setSummary("%s");

في الواقع ، من الأسلم تعيين المنطقة الزمنية الحالية على الجهاز مع Time.getCurrentTimezone() ، وإلا ستحصل على التوقيت الحالي بالتوقيت العالمي المنسق (UTC).

Time today = new Time(Time.getCurrentTimezone());
today.setToNow();

بعد ذلك ، يمكنك الحصول على جميع حقول التاريخ التي تريدها ، مثل ، على سبيل المثال:

textViewDay.setText(today.monthDay + "");             // Day of the month (1-31)
textViewMonth.setText(today.month + "");              // Month (0-11)
textViewYear.setText(today.year + "");                // Year 
textViewTime.setText(today.format("%k:%M:%S"));  // Current time

انظر android.text.format.Time فئة لجميع التفاصيل.

تحديث

كما يشير العديد من الأشخاص ، تقول Google أن هذا الفصل به عدد من المشكلات ولا يُفترض استخدامه بعد الآن:

يحتوي هذا الفصل على عدد من المشكلات ويوصى باستخدام GregorianCalendar بدلاً من ذلك.

مشاكل معروفة:

ولأسباب تاريخية عند إجراء الحسابات الزمنية ، فإن جميع الحسابات تجري حاليًا باستخدام الأعداد الصحيحة 32 بت. هذا يحد من النطاق الزمني يمكن الاعتماد عليه من عام 1902 حتى عام 2037. راجع مقالة ويكيبيديا حول مشكلة عام 2038 للحصول على التفاصيل. لا تعتمد على هذا السلوك. قد يتغير في المستقبل. سيؤدي استدعاء switchTimezone (String) في تاريخ غير موجود ، مثل وقت جدار تم تخطيه بسبب انتقال DST ، إلى تاريخ في عام 1969 (أي -1 ، أو ثانية واحدة قبل 1 يناير 1970 UTC). يفترض جزء كبير من التنسيق / التحليل نص ASCII ولذلك فهو غير مناسب للاستخدام مع البرامج النصية التي لا تدعم ASCII.





android user-interface android-preferences