設定 Android Jetpack の一部。
設定により、ユーザーはアプリの機能と動作を変更できます。設定は、アプリがクラウドとデータを同期する頻度など、バックグラウンドの動作に影響する場合や、コンテンツやユーザー インターフェースの表示の変更など、対象範囲が広くなる場合があります。
ユーザーによる構成可能な設定をアプリに統合するには、AndroidX Preference ライブラリを使用します。このライブラリは、ユーザー インターフェースを管理し、ストレージとやり取りするため、デベロッパーはユーザーが構成できる個々の設定のみを定義します。ライブラリには、デバイスと OS バージョン間で一貫したユーザー エクスペリエンスを提供するマテリアル デザイン テーマが付属しています。
始める
Preference
は、Preference ライブラリの基本的な構成要素です。設定画面には Preference
階層があります。この階層は XML リソースとして定義することも、コード内で階層を作成することもできます。
以下のセクションでは、AndroidX Preference ライブラリを使用してシンプルな設定画面を作成する方法について説明します。
始める前に、Preference ライブラリの依存関係を build.gradle
ファイルに追加します。
Groovy
dependencies { implementation "androidx.preference:preference-ktx:1.2.0" }
Kotlin
dependencies { implementation("androidx.preference:preference-ktx:1.2.0") }
Gradle の同期が完了したら、タスクの XML の部分に進みます。
階層を作成する
プロジェクトで res/xml
フォルダに移動し、preferences.xml
ファイルを作成して次のコードを追加します。
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> <SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/> <Preference app:key="feedback" app:title="Send feedback" app:summary="Report technical issues or suggest new features"/> </PreferenceScreen>
この階層には、2 つの Preference
オブジェクトが含まれています。1 つは、ユーザーが設定のオンとオフを切り替えることができる SwitchPreferenceCompat
で、もう 1 つは、ウィジェットがない基本の Preference
です。
階層を構築する場合、各 Preference
に一意のキーが必要です。
階層をインフレートする
XML 属性から階層をインフレートするには、次の例に示すように、PreferenceFragmentCompat
を作成し、onCreatePreferences()
をオーバーライドして、インフレートする XML リソースを指定します。
Kotlin
class MySettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) } }
Java
public class MySettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); } }
その後、他の Fragment
の場合と同様に、この Fragment
を Activity
に追加できます。
Kotlin
class MySettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportFragmentManager .beginTransaction() .replace(R.id.settings_container, MySettingsFragment()) .commit() } }
Java
public class MySettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportFragmentManager() .beginTransaction() .replace(R.id.settings_container, new MySettingsFragment()) .commit(); } }
次の画像に結果が表示されます。
設定をモニタリングする
設定が変更されたときにイベントを取得するには、リスナーを登録します。
Kotlin
findPreference<SwitchPreferenceCompat>("notifications") ?.setOnPreferenceChangeListener { _, newValue -> Log.d("Preferences", "Notifications enabled: $newValue") true // Return true if the event is handled. } findPreference<Preference>("feedback") ?.setOnPreferenceClickListener { Log.d("Preferences", "Feedback was clicked") true // Return true if the click is handled. }
Java
SwitchPreferenceCompat notificationsPref = findPreference("notifications"); if (notificationsPref != null) { notificationsPref.setOnPreferenceChangeListener((preference, newValue) -> { Log.d("Preferences", String.format("Notifications enabled: %s", newValue)); return true; // Return true if the event is handled. }); } Preference feedbackPref = findPreference("feedback"); if (feedbackPref != null) { feedbackPref.setOnPreferenceClickListener((preference) -> { Log.d("Preferences", "Feedback was clicked"); return true; // Return true if the event is handled. }); }
現在の設定値を読み取る
PreferenceFragmentCompat
を使用すると、設定の保存と読み取りに関連する機構の多くを非表示にできます。ただし、すべては SharedPreferences
を使用して格納されます。これらの値は、通常どおり SharedPreferences
を使用して読み取ることができます。
Kotlin
val preferences = PreferenceManager.getDefaultSharedPreferences(this).all preferences.forEach { Log.d("Preferences", "${it.key} -> ${it.value}") }
Java
var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll(); preferences.forEach((key, value) ->{ Log.d("Preferences", String.format("%s -> %s", key, value)); });
上記のスニペットでは、アプリのデフォルト SharedPreferences
のインスタンスを取得し、保存されているすべての値にアクセスしてループし、Logcat に出力しています。