(Android Studio 0.8.14) PreferenceActivityが作れますが、中身がほとんどDeprecatedってなんとかならんのかい!
- 専用のActivityを作る
- PreferenceFragmentを作る
- 動くようにしてやる
これでいってみます。
専用のActivityを作る
- appを右クリックして、New → Activity → Blank Activityを作る
- (ここではSettingsActivityと名付けます)
- レイアウトを編集してFrameLayoutだけにする(コードは後で)
- この1画面だけなので match_parentで、contextもここで指定しちゃいましょう
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/settings_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SettingsActivity" />
PreferenceFragmentを作る
- appを右クリックして、New → Fragment → Fragment(Blank)を作る
- (ここではSettingsFragmentと名付けます)
- Create layout XML?、include fragment factory method?、include interface callbacks? のチェックを外す
- ソースを変更
- 普通のFragmentみたいに再作成チェック(onCreateでsavedInstanceStateがNullか否か)しなくていいんだろか?
public class SettingsFragment extends PreferenceFragment {
public SettingsFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
- レイアウトを必要に応じて変更
- [本家ガイド] (http://developer.android.com/design/patterns/settings.html)などを参考にしてください
- とりあえずここではTextPreferenceを二つ作ったとします
動くようにしてやる
- FragmentにListenerを設定します
settingsFragment
@Override
public void onResume() {
super.onResume();
getPreferenceManager().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
getPreferenceManager().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(getString(R.string.preference_key1))) {
EditTextPreference pref = (EditTextPreference) findPreference(key);
pref.setSummary(pref.getText());
} else if (key.equals(getString(R.string.preference_key2))) {
EditTextPreference pref = (EditTextPreference) findPreference(key);
pref.setSummary(pref.getText());
}
}
- Activityから呼んでやります
settingsActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
if(savedInstanceState == null) {
getFragmentManager().beginTransaction()
.replace(R.id.settings_container, new SettingsFragment())
.commit();
}
}
最小限ではこのくらいで動くはずです。