PreferenceFragmentを使った設定画面で、例えば、複数画面のPreferenceを簡単に作ろうとすると
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen android:title="test1">
<Preference android:title="test1-1">
<Preference android:title="test1-2">
</PreferenceScreen>
</PreferenceScreen>
とネストをかければ複数画面を作れますが、これだとネストされたPreferenceScreen画面には、親のPreferenceScreenでデザインしたであろうレイアウト(ActionBarやbuttombarなど)が適用されません。
そこで、親のPreference要素をクリックすると別のフラグメントに置き換えるという、従来のFragmentの切り替え方でなんとかしました。
SettingActivity.java
public class SettingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// activity_setting.xmlはfragmentを入れるレイアウトxml
setContentView(R.layout.activity_setting);
getFragmentManager().beginTransaction().replace(R.id.fragment_container,
new UserPreferenceFragment()).commit();
}
}
class UserPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// preference_header.xmlは親の設定画面xml
addPreferencesFromResource(R.xml.preference_header);
Preference.OnPreferenceClickListener subpreference = new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
getPreferenceScreen().removeAll();
switch(preference.getKey()) {
// preference_test1,2,3 は子の設定画面
case "test1":
addPreferencesFromResource(R.xml.preference_test1); break;
case "test2":
addPreferencesFromResource(R.xml.preference_test2); break;
case "test3":
addPreferencesFromResource(R.xml.preference_test3); break;
}
return true;
}
};
final Preference test1 = (Preference) findPreference("test1");
final Preference test2 = (Preference) findPreference("tesst2");
final Preference test3 = (Preference) findPreference("test3");
test1.setOnPreferenceClickListener(subpreference);
test2.setOnPreferenceClickListener(subpreference);
test3.setOnPreferenceClickListener(subpreference);
}
}
ホント地味にですが、setOnPreferenceClickListenerをできるだけきれいに、複数作るのに苦労しました。(ひとつずつ定義して当てはめるには量が多かったので)
参考: