設定 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 の場合と同様に、この FragmentActivity に追加できます。

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();
    }
}

次の画像に結果が表示されます。

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

設定をモニタリングする

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

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

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.
    }

現在の設定値を読み取る

PreferenceFragmentCompat を使用すると、設定の保存と読み取りに関連する機構の多くを非表示にできます。ただし、すべては SharedPreferences を使用して格納されます。これらの値は、通常どおり SharedPreferences を使用して読み取ることができます。

Kotlin

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

Java

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

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