programing

Android 목록 기본 설정: 요약을 선택한 값으로 지정하시겠습니까?

newsource 2022. 11. 6. 10:29

Android 목록 기본 설정: 요약을 선택한 값으로 지정하시겠습니까?

XML 파일에 정의된 목록 기본 설정을 사용하는 기본 설정 액티비티가 있습니다.리스트 액티비티의 요약을 선택한 값으로 설정하려면 어떻게 해야 합니까?

가장 간단한 방법은 Android에 맡기는 것입니다.요약이 선택한 값과 일치하도록 하는 경우 XML 또는 를 사용하여의 요약을 설정할 수 있습니다.setSummarymethod(Javava )의 를 참조해 주세요.예를 들어 다음과 같습니다.

<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이치노된 값: the the the는는 theandroid: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" />

매우 간단합니다. XML 정의에 다음 속성을 추가합니다.

<ListPreference
...    
app:useSimpleSummaryProvider="true"
...
/>

먼저 onCreate에서 List Preference에 대한 참조를 가져옵니다.find Preference()를 사용할 수 있습니다.예를 들어 다음과 같습니다.

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

이게 바로 내가 한 일이고 잘 작동한다.onShared Preference Change Listener에서는 변경되는 키만 체크하고 List Preferences에서는 if 스테이트먼트를 사용하여 이를 entryValue가 아닌 Human readable(엔트리)로 되돌립니다.꽤 간단해.

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>

다음은 유용한 "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에서 삭제됩니다.

사용자 선택 후 호출음 기본 설정의 요약 업데이트를 처리하는 한 가지 방법이 있습니다.

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

Preference Activity에 bind Preference Summary ToValue 메서드가 있습니다.

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

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

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

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

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

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

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