設定を整理する 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 に実装されます。

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

KotlinJava
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
   
}
}
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 を起動する方法については、以下をご覧ください。 設定アクション