Android 목록 환경 설정 : 선택한 값으로 요약이 있습니까?


112

내 XML 파일에 정의 된대로 목록 기본 설정을 사용하는 기본 설정 활동이 있습니다. 목록 활동의 요약을 선택한 값으로 설정하려면 어떻게해야합니까?

감사합니다!

답변:


410

이를 수행하는 가장 간단한 방법은 Android가 대신 수행하도록하는 것입니다. 요약이 선택한 값과 일치하기를 원한다고 가정하면 XML 또는 Java 의 메소드 사용하여 요약을로 설정할ListPreference"%s" 수 있습니다 setSummary. 예를 들면 :

<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. 활동을 입력 할 때 목록의 요약도 올바르게 설정됩니다. 처음에 설정하기 위해 특별한 코드를 작성할 필요가 없습니다.

이것은 AndroidX 에서도 작동 합니다 ListPreference.

나는 소비 까지 와 일 처리에 너무 많은 시간을 SharedPreferences나는이 발견하기 전에 청취자.


1
알아! 나는 그 우아한 솔루션을 좋아합니다. 너무 간단하지만 찾기가 어렵습니다.)
sgably

7
값이 변경 될 때 요약이 업데이트되지 않기 때문에 나는 ...이 재치 수동 업데이트를 결합했다 ...
Renetik

4
훌륭한 대답입니다. 믿거 나 말거나 실제로 문서화되어 있습니다 : developer.android.com/reference/android/preference/…
Lior

1
에 대한 API> = 11이 필요하다는 것을 확인할 수 있습니까 "%s"? 내 테스트에서 "%s"Gingerbread 및 이전 버전에서 작동하지 않습니다.
andreas1724

1
@BaptisteCandellier 헤즈 업 감사합니다. 존재하는 것이 있으면 Android 팀에서 지원을 중단합니다. 에 대한 링크를 추가했습니다 androidx.
George Hilliard

29

OnPreferenceChangeListener요약을 동적으로 변경하는 데 사용할 수 있습니다 . 문제는 android:entryValues캡션 ( android:entries) 이 아니라 선택한 값 (에서 )을 가져 오는 것 입니다. 다음 코드에서는을 사용 toString()했지만 적절한 해결책은 값에 대한 캡션을 찾는 것입니다. 어쨌든 아이디어는 작동합니다.

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

나는 또한 비슷한 것을 얻고 싶었지만 https://stackoverflow.com/a/8155029/592025 의 문제 는 내 선호도에 대한 가치를 보여줍니다 (1, 2 3 등). 선택한 값에 해당하는 항목 (사람이 읽을 수있는 문자열)을 표시하고 싶습니다.

그래서 저는 이것을 이런 식으로 바꾸었고 제가 필요로하는 방식으로 작동했습니다.

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

비결은 값이 변경되면 값을 명시 적으로 설정하고 항목을 다시 읽는 getEntry()대신 사용하는 것입니다 getValue().


8

나는 당신이 찾고있는 것이 당신이 생각할 수있는 매우 간단하다고 생각합니다. 다음 코드 줄을 Preference항목에 추가하십시오 .

android:summary="%1$s"

따라서 다음과 같이 보일 것입니다.

<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

먼저 onCreate에서 ListPreference에 대한 참조를 가져옵니다. findPreference ()를 사용할 수 있습니다. 예를 들면 :

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

그런 다음 Activity를 처음로드 할 때와 환경 설정 값이 변경 될 때마다 ListPreference의 값을 가져 오려는 방법을 사용하고 다음을 사용하여 요약을 설정합니다.

pref.setSummary(theNewString);

2

이것은 내가 사용하고있는 코드이며 setValue를 수동으로 호출하지 않습니다. 이것은 이미 이후 단계에서 수행되었다고 믿습니다.

다음은 예입니다.

@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

이것은 정확히 내가 한 일이며 훌륭하게 작동합니다. 에서 onSharedPreferenceChangeListener ListPreferences이 경우 문장과 인간이 읽을 수 (대신 entryValue의 항목)로 다시 변환을 위해 나는 단지 다음 변경지고 있는지의 키를 확인합니다. 아주 간단합니다.

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

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"
        />

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
이상적으로는 요약을 동적으로 읽어 두 곳에서 추적 할 필요가 없습니다.
조지 힐리

0

다음은 유용한 "android : summary"문자열을 다루는 midhunhk의 답변의 확장 버전입니다.

        // 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'";
...

그리고 명확하게 말하면 android : summary는 관련 xml에서 제거됩니다.


0

사용자 선택에 따른 벨소리 기본 설정의 요약 업데이트를 처리하는 한 가지 방법이 있습니다.

    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

PreferenceActivity에서 bindPreferenceSummaryToValue 메소드를 사용합니다.

다음과 같이 목록에 요약을 쉽게 추가 할 수 있습니다.

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

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

OnCreate 메서드에서 다음과 같이 bind 함수를 호출합니다.

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

같은 방법으로 다른 요약을 쉽게 추가 할 수 있습니다.

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

0

onCreatePreferences에서 다음을 수행하십시오.

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]);
      }
    }
 }  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.