XML dosyamda tanımlanan bir Liste Tercihleri kullanan bir Tercih etkinliğim var. Liste etkinliğinin özetini seçilen değere nasıl ayarlayabilirim?
Teşekkür ederim!
XML dosyamda tanımlanan bir Liste Tercihleri kullanan bir Tercih etkinliğim var. Liste etkinliğinin özetini seçilen değere nasıl ayarlayabilirim?
Teşekkür ederim!
Yanıtlar:
Bunu yapmanın en basit yolu, Android'in bunu sizin için yapmasını sağlamaktır. Eğer özeti seçilen değeri eşleştirmek istediğiniz varsayarsak, sadece olabilir özetini ayarlamak ListPreferenceiçin"%s" her iki XML veya kullanarak setSummaryJava yöntemi. Örneğin:
<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, tercihinin ListPreferenceseçicisinde görüntülendiği gibi mevcut dize değeriyle değiştirir . Listenin özeti, aktiviteye girdiğinizde de doğru şekilde ayarlanacaktır — başlangıçta ayarlamak için herhangi bir özel kod yazmanız gerekmez.
Bu aynı zamanda AndroidX ile de çalışırListPreference .
Ben harcanan kadar olan mucking çok fazla zaman SharedPreferencesbunu keşfetti önce dinleyici.
"%s"? Testlerimde "%s"Gingerbread ve önceki sürümlerle çalışmıyor.
androidx.
OnPreferenceChangeListenerÖzeti dinamik olarak değiştirmek için kullanabilirsiniz . Sorun, android:entryValuesbaşlık ( android:entries) değil, seçilen değeri (buradan ) almasıdır . Aşağıdaki kodda kullandım toString(), ancak uygun çözüm, değer için başlık bulmaktır. Her neyse, fikir işe yarıyor:
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;
}
});
}
}
Ben de benzer bir şey elde etmek istedim, ancak https://stackoverflow.com/a/8155029/592025 ile ilgili sorun , tercihimin değerini göstermesidir (1, 2 3 vb. Gibi). Seçilen değere karşılık gelen girişi (insan tarafından okunabilir dize) göstermek istiyorum.
Ben de bu şekilde değiştirdim ve ihtiyacım olan şekilde çalıştım.
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;
}
});
Hüner kullanmaktır getEntry()yerine getValue()ve değer değiştirildiğinde kez açıkça değerini ve girişi geri okumak için.
Bence aradığınız şey düşünebileceğiniz kadar basit, aşağıdaki kod satırını öğenize ekleyin Preference:
android:summary="%1$s"
Yani şöyle bir şeye benzeyecek:
<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" />
Önce onCreate'inizde ListPreference için bir referans alın. FindPreference () kullanabilirsiniz. Örneğin:
ListPreference pref = (ListPreference) findPreference("thePreferencesKey");
Ardından, Aktiviteyi ilk yüklediğinizde ve tercihler değeri değiştirildiğinde, ListPreference değerini almak istediğiniz yöntemi kullanın ve özeti şununla ayarlayın:
pref.setSummary(theNewString);
Kullandığım kod bu, setValue'yi manuel olarak çağırmıyor, çünkü bunun daha sonraki bir aşamada yapıldığına inanıyorum.
İşte bir örnek:
@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;
}
Bu tam olarak yaptığım şey ve harika çalışıyor. In onSharedPreferenceChangeListener ListPreferences eğer ifadelere İnsan okunabilir (yerine entryValue girişi) geri dönüştürmek için I tam o değişti oluyor ne anahtarı kontrol edip. Gayet basit.
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 düzeni
<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 dizisi
<?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>
Midhunhk yanıtının yararlı "android: özet" dizesini de ele alan genişletilmiş bir sürümü burada.
// 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'";
...
Ve daha açık olmak gerekirse, android: abstract ilgili xml'den kaldırılmıştır.
Zil sesi tercihinin kullanıcı seçimini takiben özet güncellemesiyle başa çıkmanın bir yolu burada.
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;
}
})
PreferenceActivity'nizde bindPreferenceSummaryToValue yönteminiz var,
Özeti şu şekilde listeye kolayca ekleyebilirsiniz:
private static void bindPreferenceSummaryToValue(Preference preference) {
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.getString(preference.getKey(), ""));
}
Yout OnCreate yönteminde bağlama işlevini şu şekilde çağırırsınız:
bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_OF_THE_LIST)));
Aynı şekilde başkalarının özetini de kolayca ekleyebilirsiniz:
bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_1)));
bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_2)));
bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_3)));
onCreatePreferences altında şunu yapın:
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]);
}
}
}