Androidの新機能として、ユーザーが設定を変更したときに、UI設定の[Summary]フィールドをユーザーが入力した値に更新するコードがいくつかあります。ただし、preferenceアクティビティが作成されたら、Summaryフィールドを対応する設定の値に設定します。お知らせ下さい。ありがとう。
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());
}
}
}
私も新しいので、最高のコードではないかもしれませんが、これは私がやっていることに似ています。 onCreateではなく、リスナーをonResumeに登録し、onPauseの登録を解除する必要があります。これがお役に立てば幸いです。
主に、設定、設定値を取得し、概要を設定するだけです。
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());
}
}
}
これでうまくいきました。
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("]"));
}
}
私がいつもやっていることは:
1-表示する必要がある設定の種類を拡張する新しいクラスを作成します(設定タイプごとに1つ)2-そのコード内で、更新された概要を表示するために適切なアクティオブを実行します
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());
}
}
res/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の両方で機能しますに注意してください。
2.2 Froyo(PreferenceActivityを表示)と4.4 KitKat(PreferenceFragmentを表示)で実行するアプリに使用しています。
お役に立てば幸いです。
まず、あなたのクラスのために:
class SettingsFragment : SettingsBaseFragment(),
// Make sure you implement the OnSharedPreferenceChangeListener
SharedPreferences.OnSharedPreferenceChangeListener,
Preference.OnPreferenceClickListener {}
次に、onSharedPreferenceChanged
には、設定結果を取得するために使用できるsharedPreferenceへの参照があります。次に、取得した最新の結果を使用して、要約を変更できます。
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
when (key) {
SETTINGS_AUTO_SETTLEMENT -> refreshSummaryForAutoSettlement(sharedPreferences?.getBoolean(SETTINGS_AUTO_SETTLEMENT, false))
}
}
// helper function for altering the summary for the preference
private fun refreshSummaryForAutoSettlement(isAutoSettlementEnabled: Boolean?) {
when (isAutoSettlementEnabled != null && isAutoSettlementEnabled) {
true -> findPreference(SETTINGS_AUTO_SETTLEMENT).summary = getString(R.string.auto_settlement_enabled_summary)
false -> findPreference(SETTINGS_AUTO_SETTLEMENT).summary = getString(R.string.auto_settlement_disabled_summary)
}
}