設定 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 オブジェクトが含まれます。 SwitchPreferenceCompat ユーザーが設定のオンとオフを切り替えることができます。また、基本的な 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);
    }
}

その後、他のケースと同様に、この FragmentActivity に追加できます。 Fragment:

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

次の図に結果を示します。

Preference 画面の例を示す画像
図 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

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。