IT박스

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

itboxs 2020. 8. 6. 08:06
반응형

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

그런 다음 활동을 처음로드 할 때와 환경 설정 값이 변경 될 때마다 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;
}

This is exactly what I did and it works great. In the onSharedPreferenceChangeListener I just check the key of what is getting changed and then for ListPreferences convert it back to the Human readable (entry instead of entryValue) with the if statements. Pretty simple.

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 layout

 <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 array

<?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>


Here's an expanded version of midhunhk's answer that addresses the helpful "android:summary" string as well

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

And, just to be clear, android:summary is removed from the related xml.


And here's one way to deal with the Ringtone preference's summary update following a user selection.

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

You hava a method bindPreferenceSummaryToValue on your PreferenceActivity,

you can easily add the summary to the list doing like this:

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

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

On yout OnCreate method you call the bind function like this:

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

You can easily add others summary on the same way:

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

under onCreatePreferences do this::

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

참고URL : https://stackoverflow.com/questions/4823442/android-list-preferences-have-summary-as-selected-value

반응형