設定を整理する Android Jetpack の一部。

設定画面が大きく複雑な場合、ユーザーが 特定の設定を選択して変更できますPreference ライブラリは、 設定画面をわかりやすく整理できます。

Preference のカテゴリ

関連するキーワードが複数ある場合 同じプロジェクトの Preference オブジェクト グループ化するには、 PreferenceCategoryPreferenceCategory は、カテゴリのタイトルを表示し、各カテゴリを視覚的に区切って表示します。 あります。

XML で PreferenceCategory を定義するには、Preference タグを PreferenceCategory:

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <PreferenceCategory
        app:key="notifications_category"
        app:title="Notifications">

        <SwitchPreferenceCompat
            app:key="notifications"
            app:title="Enable message notifications"/>

    </PreferenceCategory>

    <PreferenceCategory
        app:key="help_category"
        app:title="Help">

        <Preference
            app:key="feedback"
            app:summary="Report technical issues or suggest new features"
            app:title="Send feedback"/>

    </PreferenceCategory>

</PreferenceScreen>

結果は次のようになります。

設定とカテゴリを示す画像
図 1. カテゴリ内の設定。

階層を複数の画面に分割する

Preference オブジェクトまたは個別のカテゴリが多数ある場合は、 それぞれ別の画面に表示できます各画面は 独自の独立した階層を持つ PreferenceFragmentCompatPreference 個のオブジェクト をリンクさせると、関連するコンテンツを含むサブ画面に、 設定。

図 2 は、メッセージ同期

階層の設定画面を示す画像
図 2. 2 つのカテゴリを持つ単純な階層。

図 3 は、複数の画面に分割された同じ設定を示しています。

階層が複数の画面に分割されていることを示す画像
図 3. 複数の画面に分割された階層。

画面を Preference でリンクするには、XML で app:fragment を宣言するか、 使用して、 Preference.setFragment()。 次の場合に PreferenceFragmentCompat の完全なパッケージ名を起動する 次の例のように、Preference がタップされます。

<Preference
        app:fragment="com.example.SyncFragment"
        .../>

関連する Fragment を含む Preference をユーザーがタップすると、インターフェース メソッドの PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment() が呼び出されます。このメソッドでは、新しい画面の表示を処理し、 画面は周囲の Activity に実装されます。

標準的な実装は次のようになります。

Kotlin

class MyActivity : AppCompatActivity(),
    PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    ...
    override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean {
        // Instantiate the new Fragment.
        val args = pref.extras
        val fragment = supportFragmentManager.fragmentFactory.instantiate(
                classLoader,
                pref.fragment)
        fragment.arguments = args
        fragment.setTargetFragment(caller, 0)
        // Replace the existing Fragment with the new Fragment.
        supportFragmentManager.beginTransaction()
                .replace(R.id.settings_container, fragment)
                .addToBackStack(null)
                .commit()
        return true
    }
}

Java

public class MyActivity extends AppCompatActivity implements
        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
    ...
    @Override
    public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
        // Instantiate the new Fragment.
        final Bundle args = pref.getExtras();
        final Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate(
                getClassLoader(),
                pref.getFragment());
        fragment.setArguments(args);
        fragment.setTargetFragment(caller, 0);
        // Replace the existing Fragment with the new Fragment.
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.settings_container, fragment)
                .addToBackStack(null)
                .commit();
        return true;
    }
}

PreferenceScreens

ネストされたフィールドを使用して、同じ XML リソース内でネストされた階層を宣言する &lt;PreferenceScreen&gt; はサポートされなくなりました。ネストされた Fragment オブジェクトを使用する してください。

別々の Activity を使用する

また、各画面を詳細にカスタマイズする必要がある場合や、画面間で Activity を完全に遷移する場合は、PreferenceFragmentCompat ごとに別々の Activity を使用できます。こうすることで、各 Activity とそれに対応する設定画面を完全にカスタマイズできます。ほとんどのアプリで、 推奨されています。代わりに、前述のように Fragments を使用してください。

Preference から Activity を起動する方法については、以下をご覧ください。 設定アクション