ฉันมีกิจกรรมการตั้งค่าที่ใช้การตั้งค่ารายการตามที่กำหนดโดยไฟล์ XML ของฉัน ฉันจะตั้งค่าสรุปของกิจกรรมรายการเป็นค่าที่เลือกได้อย่างไร
ขอบคุณ!
ฉันมีกิจกรรมการตั้งค่าที่ใช้การตั้งค่ารายการตามที่กำหนดโดยไฟล์ XML ของฉัน ฉันจะตั้งค่าสรุปของกิจกรรมรายการเป็นค่าที่เลือกได้อย่างไร
ขอบคุณ!
คำตอบ:
วิธีที่ง่ายที่สุดคือให้ Android ทำเพื่อคุณ สมมติว่าคุณต้องการสรุปเพื่อให้ตรงกับค่าที่เลือกคุณสามารถตั้งค่าการสรุปของListPreferenceการ"%s"ใช้ XML หรือ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เครื่องมือเลือกแสดง นอกจากนี้ข้อมูลสรุปของรายการจะถูกตั้งค่าอย่างถูกต้องเมื่อคุณเข้าสู่กิจกรรมคุณไม่จำเป็นต้องเขียนโค้ดพิเศษใด ๆ เพื่อตั้งค่าในตอนแรก
นี้ยังทำงานร่วมกับ ListPreferenceAndroidX
ผมใช้เวลาห่างไกลเวลามากเกินไปสิกับSharedPreferencesผู้ฟังก่อนที่ผมค้นพบนี้
"%s"? ในการทดสอบของฉันใช้"%s"ไม่ได้กับ Gingerbread และเวอร์ชันก่อนหน้า
androidxฉันได้เพิ่มการเชื่อมโยงไปยัง
คุณสามารถใช้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" />
ก่อนอื่นให้อ้างอิงถึง ListPreference ใน onCreate ของคุณ คุณสามารถใช้ 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;
}
นี่คือสิ่งที่ฉันทำและได้ผลดี ในonSharedPreferenceChangeListenerฉันเพียงแค่ตรวจสอบคีย์ของสิ่งที่ได้รับการเปลี่ยนแปลงจากนั้นสำหรับ ListPreferences แปลงกลับเป็น Human ที่อ่านได้ (รายการแทนที่จะเป็น entryValue) ด้วยคำสั่ง if ค่อนข้างเรียบง่าย
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>
นี่คือคำตอบของ midhunhk เวอร์ชันขยายซึ่งจะกล่าวถึงสตริง "android: summary" ที่เป็นประโยชน์เช่นกัน
// 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;
}
})
คุณมีวิธีการ bindPreferenceSummaryToValue กับ PreferenceActivity ของคุณ
คุณสามารถเพิ่มสรุปลงในรายการได้อย่างง่ายดายโดยทำดังนี้:
private static void bindPreferenceSummaryToValue(Preference preference) {
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.getString(preference.getKey(), ""));
}
ใน yout 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]);
}
}
}