Настройка предпочтения пользовательского интерфейса. Сводное поле для значения предпочтительности.
Новое для Android, у меня есть код, когда пользователь меняет предпочтение. Я обновляю поле Сводка в предпочтении пользовательского интерфейса как значение, которое они ввели. Однако, когда создается активность предпочтений, я хотел бы установить поля Сводки как значения в соответствующих настройках.
Пожалуйста, порекомендуйте. Благодарю.
public class MyPreferenceActivity extends PreferenceActivity implements
OnSharedPreferenceChangeListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference);
SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
sp.registerOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
Preference pref = findPreference(key);
if (pref instanceof EditTextPreference) {
EditTextPreference etp = (EditTextPreference) pref;
pref.setSummary(etp.getText());
}
}
}
Ответы
Ответ 1
Я тоже новичок, поэтому не лучший код, но это похоже на то, что я делаю. Вероятно, вы захотите зарегистрировать слушателя onResume и отменить регистрацию onPause, а не onCreate. Надеюсь, это поможет.
В основном вам просто нужно захватить префикс, значение pref и задать сводку.
public class MyPreferenceActivity extends PreferenceActivity implements
OnSharedPreferenceChangeListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference);
SharedPreferences sp = getPreferenceScreen().getSharedPreferences();
EditTextPreference editTextPref = (EditTextPreference) findPreference("thePrefKey");
editTextPref
.setSummary(sp.getString("thePrefKey", "Some Default Text"));
}
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
Preference pref = findPreference(key);
if (pref instanceof EditTextPreference) {
EditTextPreference etp = (EditTextPreference) pref;
pref.setSummary(etp.getText());
}
}
}
Ответ 2
Это сработало для меня.
public class PrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener
{
private Preference pref;
private String summaryStr;
String prefixStr;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
SharedPreferences sharedPref = getPreferenceScreen().getSharedPreferences();
sharedPref.registerOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
//Get the current summary
pref = findPreference(key);
summaryStr = (String)pref.getSummary();
//Get the user input data
prefixStr = sharedPreferences.getString(key, "");
//Update the summary with user input data
pref.setSummary(summaryStr.concat(": [").concat(prefixStr).concat("]"));
}
}
Ответ 3
Я обычно делаю:
1 - Создайте новый класс, который расширяет предпочтение, которое мне нужно показать (1 для каждого типа предпочтений)
2 - Внутри своего кода сделайте соответствующий actiob, чтобы показать обновленное резюме
3 - Обратитесь к этому классу в файл res/xml/preferences.xml
Позвольте мне сделать небольшой пример, полезный для EditTextPreference:
CLS_Prefs_Edit.java
/**
* CLS_Prefs_Edit class
*
* This is the class that allows for a custom EditTextPrefence
* (auto refresh summary).
*
* @category Custom Preference
* @author Luca Crisi ([email protected])
* @copyright Luca Crisi
* @version 1.0
*/
package com.your_name.your_app;
/* -------------------------------- Imports --------------------------------- */
import android.content.Context;
import android.preference.EditTextPreference;
import android.util.AttributeSet;
public final class CLS_Prefs_Edit
extends EditTextPreference
{
/* ---------------------------- Constructors ---------------------------- */
public CLS_Prefs_Edit(final Context ctx, final AttributeSet attrs)
{
super(ctx, attrs);
}
public CLS_Prefs_Edit(final Context ctx)
{
super(ctx);
}
/* ----------------------------- Overrides ------------------------------ */
@Override
public void setText(final String value)
{
super.setText(value);
setSummary(getText());
}
}
Рез /XML/preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
>
<PreferenceCategory android:title="@string/pref_phone_cat">
<!-- NORMAL EditTextPreference, NO summary update -->
<!-- <EditTextPreference -->
<!-- android:widgetLayout="@layout/arr_dn" -->
<!-- android:key="phone" -->
<!-- android:title="@string/pref_phone_title" -->
<!-- android:summary="@string/pref_phone_summ" -->
<!-- android:defaultValue="" -->
<!-- android:inputType="phone" -->
<!-- android:digits="+1234567890" -->
<!-- /> -->
<!-- MY EditTextPreference, WITH summary update -->
<com.your_name.your_app.CLS_Prefs_Edit
android:widgetLayout="@layout/arr_dn"
android:key="phone"
android:title="@string/pref_phone_title"
android:summary="@string/pref_phone_summ"
android:defaultValue=""
android:inputType="phone"
android:digits="+1234567890"
/>
</PreferenceCategory>
</PreferenceScreen>
Конечно, задайте свои строки в /res/values /strings, и все готово.
Обратите внимание, что это решение работает как для PreferenceFragments, так и для PreferenceActivities.
Я использую его для приложения tha работает на 2.2 Froyo (показывая PreferenceActivity), а также на 4.4 KitKat (показывая PreferenceFragment)
Надеюсь, это поможет.