現在の値を概要として表示するために、PreferenceFragment と OnChangeListener を使用して設定画面を実装しました。次のコードは問題なく動作しますが、この方法では、設定ごとに 1 つの OnChangeListener が必要です。
設定Activity.java
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
public class UserSettingActivity extends PreferenceActivity {
public static final String PREF_EXCERCISES = "pref_number_of_exercises";
public static final String PREF_TASKS = "pref_number_of_tasks";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
}
public static class MyPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//add the settings.xml layout
addPreferencesFromResource(R.xml.settings);
// update the preferences if they change
setUpdatePreferences();
}
private void setUpdatePreferences() {
//get the specified preferences using the key declared in preferences.xml
ListPreference dataPrefConType = (ListPreference) findPreference(PREF_EXCERCISES);
//get the description from the selected item
dataPrefConType.setSummary( dataPrefConType.getEntry() );
//when the user choose other item the description changes too with the selected item
dataPrefConType.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
preference.setSummary(o.toString());
return true;
}
});
}
}
}
設定.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference
android:defaultValue="15"
android:enabled="true"
android:key="pref_number_of_exercises"
android:numeric="integer"
android:title="Number of exercises" />
<EditTextPreference
android:defaultValue="15"
android:enabled="true"
android:key="pref_number_of_tasks"
android:numeric="integer"
android:title="Number of tasks" />
</PreferenceScreen>
それは同じタスクであるため (サマリーに値を表示)、すべての設定に対して 1 つの OnChangeListener を使用したいと考えています。コードも読みやすくなります。
このスタックオーバーフローの投稿では、すべてに対して 1 つの OnSharedPreferenceChangeListener を使用しています。しかし、SettingsActivity.java を次のコードに変更すると、設定画面を開くとアプリがクラッシュします。「残念ながら、PreferenceExample は停止しました。」
設定Activity.java
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.util.Log;
public class UserSettingActivity extends PreferenceActivity {
public static final String PREF_EXCERCISES = "pref_number_of_exercises";
public static final String PREF_TASKS = "pref_number_of_tasks";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
}
public static class MyPreferenceFragment extends PreferenceFragment
implements OnSharedPreferenceChangeListener {
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//add the settings.xml layout
addPreferencesFromResource(R.xml.settings);
// update the preferences if they change
//setUpdatePreferences();
}
@Override
public void onResume() {
super.onResume();
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
@Override
public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) {
Log.i("settings", "preference changed: " + key);
}
}
}