Tùy chọn danh sách Android: có tóm tắt là giá trị đã chọn?


112

Tôi có hoạt động Sở thích sử dụng Tùy chọn Danh sách như được định nghĩa bởi tệp XML của tôi. Làm cách nào để đặt tóm tắt hoạt động danh sách thành giá trị được chọn?

Cảm ơn bạn!

Câu trả lời:


410

Cách đơn giản nhất để thực hiện việc này là nhờ Android làm điều đó cho bạn. Giả sử bạn muốn bản tóm tắt khớp với giá trị đã chọn, bạn có thể chỉ cần đặt bản tóm tắt ListPreferencethành"%s" sử dụng XML hoặc setSummaryphương thức trong Java. Ví dụ:

<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ẽ thay thế %sbằng giá trị chuỗi hiện tại của tùy chọn, như được hiển thị bởi bộ ListPreferencechọn của. Bản tóm tắt của danh sách cũng sẽ được đặt chính xác khi bạn nhập hoạt động — bạn không phải viết bất kỳ mã đặc biệt nào để thiết lập ban đầu.

Điều này cũng hoạt động với AndroidX ListPreference.

Tôi đã dành xa quá nhiều thời gian mucking với SharedPreferencesthính giả trước khi tôi phát hiện ra này.


1
Tôi biết! Tôi thích những giải pháp thanh lịch. Thật đơn giản, nhưng khó tìm;)
sgibly

7
Tôi đã phải kết hợp wit tay cập nhật này ... vì tóm tắt không được cập nhật khi giá trị được thay đổi ...
Renetik

4
Câu trả lời xuất sắc. Tin hay không nhưng điều này thực sự được ghi lại: developer.android.com/reference/android/preference/…
Lior

1
Bạn có thể xác nhận rằng bạn cần API> = 11 "%s"không? Trong các thử nghiệm của tôi, "%s"không hoạt động với Gingerbread và các phiên bản trước đó.
andreas1724,

1
@BaptisteCandellier cảm ơn vì sự quan tâm. Nếu có điều gì đó tồn tại, nhóm Android sẽ không dùng nữa. Tôi đã thêm một liên kết đến androidx.
George Hilliard

29

Bạn có thể sử dụng OnPreferenceChangeListenerđể thay đổi động bản tóm tắt. Vấn đề là nó nhận giá trị được chọn (từ android:entryValues), không phải chú thích ( android:entries). Trong đoạn mã sau tôi đã sử dụng toString(), nhưng giải pháp thích hợp là tìm chú thích cho giá trị. Dù sao, ý tưởng hoạt động:

public class Preferences extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.your_prefs);

        ListPreference listPreference = (ListPreference) findPreference("preference_key");
        if(listPreference.getValue()==null) {
            // to ensure we don't get a null value
            // set first value by default
            listPreference.setValueIndex(0);
        }
        listPreference.setSummary(listPreference.getValue().toString());
        listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                preference.setSummary(newValue.toString());
                return true;
            }
        });
    }
}

18

Tôi cũng muốn đạt được điều gì đó tương tự, nhưng vấn đề với https://stackoverflow.com/a/8155029/592025 là nó hiển thị giá trị cho sở thích của tôi (như 1, 2 3, v.v.). Tôi muốn hiển thị mục nhập (chuỗi người có thể đọc được) tương ứng với giá trị đã chọn.

Vì vậy, tôi đã thay đổi nó theo cách này và hoạt động theo cách tôi cần.

listPreference.setSummary(servicePreference.getEntry().toString());
listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            // Set the value as the new value
            listPreference.setValue(newValue.toString());
            // Get the entry which corresponds to the current value and set as summary
            preference.setSummary(listPreference.getEntry());
            return false;
        }
    });

Mẹo là sử dụng getEntry()thay vì getValue()và khi giá trị được thay đổi, để đặt giá trị một cách rõ ràng và đọc lại mục nhập.


8

Tôi nghĩ rằng những gì bạn đang tìm kiếm rất đơn giản mà bạn có thể nghĩ, hãy thêm dòng mã sau vào Preferencemặt hàng của bạn :

android:summary="%1$s"

Vì vậy, nó sẽ giống như sau:

<ListPreference
            android:key="@string/pref_temp_key"
            android:title="@string/pref_temp_title"
            android:dialogTitle="@string/pref_temp_dialog_title"
            android:entries="@array/pref_tempUnit_entries"
            android:entryValues="@array/pref_tempUnit_entries"
            android:summary="%1$s"
            android:defaultValue="@string/pref_temp_default_value" />

4

Đầu tiên, hãy lấy tham chiếu đến ListPreference trong onCreate của bạn. Bạn có thể sử dụng findPreference (). Ví dụ:

ListPreference pref = (ListPreference) findPreference("thePreferencesKey");

Sau đó, khi bạn tải Activity lần đầu tiên và bất cứ khi nào giá trị tùy chọn được thay đổi, hãy sử dụng bất kỳ phương pháp nào bạn muốn để lấy giá trị của ListPreference và đặt tóm tắt với:

pref.setSummary(theNewString);

2

Đây là mã tôi đang sử dụng, nó không gọi setValue theo cách thủ công, vì tôi tin rằng điều này đã được thực hiện ở giai đoạn sau.

Đây là một ví dụ:

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

    ListPreference listPreference = (ListPreference) preference;
    int index = listPreference.findIndexOfValue(textValue);

    CharSequence[] entries = listPreference.getEntries();

    preference.setSummary(
                index >= 0
                        ? entries[index]
                        : null);

    return true;
}

0

Đây chính xác là những gì tôi đã làm và nó hoạt động tuyệt vời. Trong onSharedPreferenceChangeListener, tôi chỉ cần kiểm tra khóa của những gì sẽ được thay đổi và sau đó đối với ListPreferences, chuyển đổi nó trở lại Con người có thể đọc được (mục nhập thay vì entryValue) bằng các câu lệnh if. Khá đơn giản.

public class MyPreferences extends PreferenceFragment implements OnSharedPreferenceChangeListener{

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
    context = getActivity();

    if (context == null){
        Log.e("error","context is null");
    }

    prefs = PreferenceManager.getDefaultSharedPreferences(context);
    myFrequencyList = (Preference)  findPreference("frequency_key");
    prefs.registerOnSharedPreferenceChangeListener(this);

}


@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {

        if(key.equals("frequency_key")){
                String freq = sharedPreferences.getString("frequency_key", "8k Hz");
                if(freq.equals("8000")){
                    freq = "8k Hz";
                }
                else if(freq.equals("16000")){
                    freq = "16k Hz";
                }
                else if(freq.equals("22050")){
                    freq = "22.05k Hz";
                }
                else if(freq.equals("44100")){
                    freq = "44.1k Hz";
                }
                else if(freq.equals("48000")){
                    freq = "48k Hz";
                }
                else{
                    freq = "8k Hz";
                }
                myFrequencyList.setSummary(freq);
        }

bố cục xml

 <ListPreference android:id="@+id/frequency_list"
        android:key="frequency_key"
        android:summary="8000"
        android:title="Sample Rate"
        android:defaultValue="8000"
        android:dialogTitle="Larger sample rates create better sound quality but larger file sizes."
        android:entries="@array/freq_titles"
        android:entryValues="@array/freq_values"
        />

mảng xml

<?xml version="1.0" encoding="utf-8"?>

<string-array name="freq_titles">
    <item>48k Hz</item>
    <item>44.1k Hz</item>
    <item>22.05k Hz</item>
    <item>16k Hz</item>
    <item>8k Hz</item>
</string-array>

<string-array name="freq_values">
    <item>48000</item>
    <item>44100</item>
    <item>22050</item>
    <item>16000</item>
    <item>8000</item>
</string-array>


1
Tốt nhất là bạn nên đọc bản tóm tắt một cách linh hoạt để không phải theo dõi nó ở hai nơi.
George Hilliard,

0

Đây là phiên bản mở rộng của câu trả lời của midhunhk cũng giải quyết chuỗi "android: Summary" hữu ích

        // Retrieve & populate flash modes
        List<String> flashmodes = params.getSupportedFlashModes();
        if (flashmodes != null) {
            final ListPreference lp = (ListPreference) findPreference("flash_list");
            final String lp_basesummary = "Set the Flash mode. The default is 'auto'";

            lp.setEntries(flashmodes.toArray(new CharSequence[flashmodes.size()]));
            lp.setEntryValues(flashmodes.toArray(new CharSequence[flashmodes.size()]));
            // If there's only one option, make it the default
            if (flashmodes.size() == 1)
                lp.setValueIndex(0);

            lp.setSummary(lp_basesummary + " [" + lp.getEntry() + "]");

            lp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    // Set the value as the new value
                    lp.setValue(newValue.toString());
                    // Get the entry which corresponds to the current value
                    // and set as summary
                    preference.setSummary(lp_basesummary + " [" + lp.getEntry() + "]");
                    return false;
                }
            });
        } else {
            // Remove the preference
            ((PreferenceGroup) findPreference("camera_preference")).removePreference(findPreference("flash_list"));
        }

        // Retrieve & populate focus modes
        List<String> focusmodes = params.getSupportedFocusModes();
        if (focusmodes != null) {
            final ListPreference lp = (ListPreference) findPreference("focus_mode_list");
            final String lp_basesummary = "Set the Focus mode. The default is 'auto'";
...

Và, chỉ cần nói rõ, bản tóm tắt android: được xóa khỏi xml có liên quan.


0

Và đây là một cách để xử lý cập nhật tóm tắt của tùy chọn Nhạc chuông sau lựa chọn của người dùng.

    final SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

    final RingtonePreference rp_shuttle = (RingtonePreference) findPreference("shuttle_tone");
    rp_shuttle.setSummary(RingtoneManager
            .getRingtone(getApplicationContext(), Uri.parse(preference.getString("shuttle_tone", "DEFAULT_SOUND")))
            .getTitle(this));

    rp_shuttle.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        public boolean onPreferenceChange(Preference mypreference, Object newValue) {
            rp_shuttle.setSummary(RingtoneManager.getRingtone(getApplicationContext(), Uri.parse(newValue + ""))
                    .getTitle(getApplicationContext()));

            return true;
        }
    })

0

Bạn có một phương thức bindPreferenceSummaryToValue trên PreferenceActivity của mình,

bạn có thể dễ dàng thêm phần tóm tắt vào danh sách như sau:

private static void bindPreferenceSummaryToValue(Preference preference) {
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

    sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
            PreferenceManager
                    .getDefaultSharedPreferences(preference.getContext())
                    .getString(preference.getKey(), ""));
}

Trên phương pháp OnCreate của bạn, bạn gọi hàm liên kết như sau:

bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_OF_THE_LIST)));

Bạn có thể dễ dàng thêm bản tóm tắt khác theo cùng một cách:

bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_1)));
bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_2)));
bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_3)));

0

trong onCreatePreferences thực hiện việc này ::

SharedPreferences sharedPreferences =getPreferenceScreen().getSharedPreferences();
PreferenceScreen prefScreen = getPreferenceScreen();
int count = prefScreen.getPreferenceCount();

for (int i = 0; i < count; i++) {
  Preference p = prefScreen.getPreference(i);
    if (p instanceof ListPreference) {
       String value = sharedPreferences.getString(p.getKey(), "");
       ListPreference listPreference = (ListPreference) preference;
       int prefIndex = listPreference.findIndexOfValue(stringValue);
       if (prefIndex >= 0) {
            preference.setSummary(listPreference.getEntries()[prefIndex]);
      }
    }
 }  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.