BETA

PreferenceScreenをネストすると外のレイアウトが崩れる

投稿日:2019-11-30
最終更新:2019-11-30

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をできるだけきれいに、複数作るのに苦労しました。(ひとつずつ定義して当てはめるには量が多かったので)

参考:

[https://techbooster.org/android/hacks/7589/:embed]

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@MewW6mの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!