読者です 読者をやめる 読者になる 読者になる

くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Java側で動的にPreferenceを作成

Androidを開発しているとどうやって楽にデバッグするか悩んでいたときに、メルカリさんのデバッグ機能の記事をみつけた

tech.mercari.com

いいな!!おもしろいな!!やりたいな!!と思い、

PreferenceActivityとかに動的に差し込めたらいいなと思ったときの備忘録

PreferenceFragmentで動的に作成するときの例

デバッグモード上でDBデータのバックアップとリストアができる例

public static class SettingsFragment extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref_settings);

        //... 通常のPreferenceの処理

        //Debug用の処理
        if (BuildConfig.DEBUG) {
            // RootのPreferenceScreenと
            // Preferenceを管理しているPreferenceManagerを取得
            PreferenceScreen root = getPreferenceScreen();
            PreferenceManager manager = getPreferenceManager();


            // まずはカテゴリを作る
            PreferenceCategory category = new PreferenceCategory(root.getContext());
            category.setTitle("Debug Mode"); //タイトルは"Debug Mode"
            root.addPreference(category);    //Preferenceのrootにcategoryを追加


            // カテゴリに含めるPreferenceScreenを作成&追加
            // 新しくPreferenceScreenを作るときはPreferenceManagerを使って作成
            PreferenceScreen restore = manager.createPreferenceScreen(root.getContext());
            restore.setTitle("リストア");
            restore.setOnPreferenceClickListener(preference -> {
                //...ボタンが押された時の処理
                return true;
            });
            category.addPreference(restore); //categoryにPreferenceScreenを追加

            // 以下同様
            PreferenceScreen backup = manager.createPreferenceScreen(root.getContext());
            backup.setTitle("バックアップ");
            backup.setOnPreferenceClickListener(preference -> {
                //...ボタンが押された時の処理
                return true;
            });
            category.addPreference(backup);
        }
    }
}

注意点(というか個人的にはまったポイント)は2つ

  1. Preferenceの種類によってインスタンスの作り方が異なる
    • PreferenceCategoryを作るときはnew PreferenceCategory()
    • PreferenceScreenを作るときはgetPreferenceManager().createPreferenceScreen()
  2. 作成したPreferenceを追加する順序が重要
    • 要素の上から作成&追加していくとうまくいく
    • root.addPreference(category);する前にmanager.createPreferenceScreen(root.getContext());するとExceptionが出てうまくいかない。。。

複数のアプリを作っているから、これを使えば、デバッグモードのハンドリングだけじゃなくて、

どのアプリにも必要な共通的な設定も簡単にモジュール化できそうな予感♪

とりあえず、以上!!

PR

こんなアプリを作っています!!

参考にしたサイト様