Android 목록 환경 설정 : 선택한 값으로 요약이 있습니까? 된대로 목록 기본 설정을 사용하는 기본

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

감사합니다!



답변

이를 수행하는 가장 간단한 방법은 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나는이 발견하기 전에 청취자.


답변

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

답변

나는 또한 비슷한 것을 얻고 싶었지만 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().


답변

나는 당신이 찾고있는 것이 당신이 생각할 수있는 매우 간단하다고 생각합니다. 다음 코드 줄을 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" />

답변

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

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

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

pref.setSummary(theNewString);

답변

이것은 내가 사용하고있는 코드이며 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;
}

답변

이것은 정확히 내가 한 일이며 훌륭하게 작동합니다. 에서 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>