設定 Android Jetpack の一部。

設定により、ユーザーはアプリの機能や動作を変更できます。設定は、アプリがクラウドとデータを同期する頻度などのバックグラウンドの動作に影響することがあります。また、ユーザー インターフェースのコンテンツや表示の変更など、さらに広い範囲に影響する場合もあります。

ユーザーが設定可能な設定をアプリに組み込むには、AndroidX Preference ライブラリを使用します。ユーザー インターフェースの管理やストレージとのやり取りはこのライブラリで実行されるため、開発者はユーザーが設定できる個々の設定値だけを定義します。ライブラリにはマテリアル デザイン テーマが付いており、このテーマにより、異なるデバイスや OS バージョンの間で一貫したユーザー エクスペリエンスが提供されます。

始める

Preference は Preference ライブラリの基本的な構成要素です。設定画面には、Preference 階層があります。この階層を XML リソースとして定義することや、コードに階層をビルドすることが可能です。

以降のセクションでは、AndroidX Preference ライブラリを使用してシンプルな設定画面を作成する方法について説明します。

始める前に、Preference ライブラリの依存関係を build.gradle ファイルに追加します。

GroovyKotlin
dependencies {
    implementation
"androidx.preference:preference-ktx:1.2.0"
}
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 リソースを指定します。

KotlinJava
class MySettingsFragment : PreferenceFragmentCompat() {
   
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource
(R.xml.preferences, rootKey)
   
}
}
public class MySettingsFragment extends PreferenceFragmentCompat {
   
@Override
   
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource
(R.xml.preferences, rootKey);
   
}
}

その後、他の Fragment の場合と同じようにして、この FragmentActivity に追加できます。

KotlinJava
class MySettingsActivity : AppCompatActivity() {
   
override fun onCreate(savedInstanceState: Bundle?) {
       
super.onCreate(savedInstanceState)
        supportFragmentManager
               
.beginTransaction()
               
.replace(R.id.settings_container, MySettingsFragment())
               
.commit()
   
}
}
public class MySettingsActivity extends AppCompatActivity {
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        getSupportFragmentManager
()
               
.beginTransaction()
               
.replace(R.id.settings_container, new MySettingsFragment())
               
.commit();
   
}
}

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

Preference 画面の例を示す画像
図 1. 2 つの Preference オブジェクトを使用して作成された設定画面

設定をモニタリングする

設定が変更されたときにイベントを取得するには、リスナーを登録します。

KotlinJava
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.
   
}
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 の場合と同様に読み取ることができます。

KotlinJava
val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences
.forEach {
   
Log.d("Preferences", "${it.key} -> ${it.value}")
}
var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll();

preferences
.forEach((key, value) ->{
   
Log.d("Preferences", String.format("%s -> %s", key, value));
});

上記のスニペットは、アプリのデフォルトの SharedPreferences のインスタンスを取得し、保存されているすべての値にアクセスしてループし、Logcat に出力します。