アンドロイド - PreferenceFragment実装方法

By JS | Last updated: December 03, 2018

PreferenceFragmentは以下のような設定画面を簡単に実装するコンポーネントです。非常に少ないコードと簡単なXMLレイアウトのコードを追加して実装することができます。 どのようにPreferenceFragmentを使用するかを知ってみましょう。

androidx preference

プロジェクトの作成

Empty Activityに生成します。 android empty activity

KotlinUse AndroidX artifactsを選択してください。(Android Studioのバージョンが3.4未満であれば、 Use AndroidX artifactsオプションがありません。移行をしたり、コードを変更してくれるとし) androidx use androidx artifacts

AndroidXでプロジェクトを作成していなかった場合、メニューから[Refactor] -> [Migrate to AndroidX ...]を押すとAndroidXを使用するプロジェクトに移行ができます。

アプリgradleで次のようにdependencyを追加する必要があります。

dependencies {
  ....
  implementation 'androidx.preference:preference:1.1.0-alpha01'
}

PreferenceFragment実装

PreferenceFragmentCompatを使用してMainPreferenceを実装します。 addPreferencesFromResourceは、レイアウトを生成する関数であるが、メニューのXMLファイルを引数として与えるViewを作成します。

MainPreference.kt

class MainPreference : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        addPreferencesFromResource(R.xml.preferences)
    }
}

上記の使用した、メニューを定義したXMLファイルを作成します。このファイルは、Viewを作成するために使用されます。 CheckBoxPreferenceは名前のようにチェックボックスのviewです。他のものも、それぞれの役割が他のviewです。

/res/xml/preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:app="http://schemas.android.com/apk/res-auto"
                  android:iconSpaceReserved="false">
    <PreferenceCategory
            android:title="Functions"
            app:iconSpaceReserved="false">

        <CheckBoxPreference
                android:key="key_add_shortcut"
                android:title="Add shortcuts"
                android:icon="@mipmap/ic_launcher"
                android:defaultValue="true"/>

        <SwitchPreference
                android:key="key_switch_on"
                android:title="Screen on"
                android:icon="@mipmap/ic_launcher"
                android:defaultValue="false"/>

    </PreferenceCategory>

    <PreferenceCategory
            android:title="Options"
            app:iconSpaceReserved="false">

        <EditTextPreference
            android:key="key_edit_name"
            android:title="Edit name"
            android:summary="Edit your name"
            android:dialogTitle="Edit your name"
            app:iconSpaceReserved="false"/>

        <ListPreference
            android:key="key_set_item"
            android:title="Main action"
            android:summary="set main action"
            android:entries="@array/action_list"
            android:entryValues="@array/action_values"
            android:dialogTitle="set main action"
            app:iconSpaceReserved="false"/>

        <PreferenceScreen
                android:title="Go to android.com"
                android:summary="browse android.com"
                app:iconSpaceReserved="false">
            <intent android:action="android.intent.action.VIEW"
                    android:data="http://www.android.com" />
        </PreferenceScreen>

    </PreferenceCategory>

</PreferenceScreen>

arrays.xmlファイルを作成して、preferences.xmlで使用するarraysも定義できます。

/res/values/arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="action_list">
        <item>action 1</item>
        <item>action 2</item>
        <item>action 3</item>
        <item>action 4</item>
    </string-array>
    <string-array name="action_values">
        <item>value 1</item>
        <item>value 2</item>
        <item>value 3</item>
        <item>value 4</item>
    </string-array>
</resources>

PreferenceFragmentはすべて実装しました。 MainActivityでこのフラグメントが見えるように設定する必要があります。 以下のように activity_mainを変更します。フラグメントを定義し、nameに私たちが作った PreferenceFragmentを設定しました。 これにより、アクティビティが生成されるときにその場所に MainPreferenceが生成されます。

/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <fragment
        android:id="@+id/main_pref"
        android:name="com.codechacha.preference.MainPreference"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

今のアプリをビルドして実行してみると、設定画面を見ることができます。

androidx preference

属性

コードのみ貼り付け動作を確認してみました。重要なのは、レイアウトと関連がある preferences.xmlです。

チェックボックスを作成するには、次のオブジェクトとプロパティを使用します。 keyは非常に重要です。チェックボックスのon / offは、オブジェクトの内部で保存されるように実装がされています。 したがって保存する部分を別々に実装する必要がありません。代わりに、いくつかの値が格納されているかどうか読み取ることができなければならんです、この keyを通じて値を読み取ることができます。 iconは、アイコンの位置を指します。 iconを設定しないと、アイコンの領域が空白に残ることができます。 defaultValueは初期値を意味します。

<CheckBoxPreference
        android:key="key_add_shortcut"
        android:title="Add shortcuts"
        android:icon="@mipmap/ic_launcher"
        android:defaultValue="true"/>

スイッチを作成するには、次のオブジェクトとプロパティを使用します。属性の意味は、上記すべて同じです。

<SwitchPreference
        android:key="key_switch_on"
        android:title="Screen on"
        android:icon="@mipmap/ic_launcher"
        android:defaultValue="false"/>

PreferenceCategoryはカテゴリに、共通のPreferenceを結ぶ役割です。アプリを見ると、赤い色でタイトルが書かれています。 iconSpaceReserved=falseアイコンのために割り当てられた領域をなくせという意味です。この属性を追加しない場合のアイコンスペースが残っており、左にパディングがあるように見えます。

<PreferenceCategory
        android:title="Functions"
        app:iconSpaceReserved="false">

</PreferenceCategory>

テキストを入力することができるPreferenceです。

<EditTextPreference
    android:key="key_edit_name"
    android:title="Edit name"
    android:summary="Edit your name"
    android:dialogTitle="Edit your name"
    app:iconSpaceReserved="false"/>

与えられたリストのうちの1つを選択することができるPreferenceです。

<ListPreference
    android:key="key_set_item"
    android:title="Main action"
    android:summary="set main action"
    android:entries="@array/action_list"
    android:entryValues="@array/action_values"
    android:dialogTitle="set main action"
    app:iconSpaceReserved="false"/>

別の画面に移るPreferenceです。 intent引数を与えブラウザがandroid.comを開くようにしました。

<PreferenceScreen
        android:title="Go to android.com"
        android:summary="browse android.com"
        app:iconSpaceReserved="false">
    <intent android:action="android.intent.action.VIEW"
            android:data="http://www.android.com" />
</PreferenceScreen>

この他にも、他のPreferenceがあり、カスタムして作成することができます。

設定値の読み取り

XMLレイアウトを少し追加すると、簡単にPreference画面を作成することができます。そして、それぞれのPreferenceを設定すると、自動的にオプションが保存されます。 保存されたオプションを読むには keyを利用します。まず、 PreferenceManagergetDefaultSharedPreferencesにSharedPreferenceを取得します。 保存されたデータがbooleanの場合 getBoolean(key, default)のように値を取得することができます。初期値がない場合defaultに設定したものを持ってくるようになります。 文字列の場合、 getStringを使用します。 IntとLong、Floatもすべて同じようにインポートします。

val sps = PreferenceManager.getDefaultSharedPreferences(this)
val addShortcut = sps.getBoolean("key_add_shortcut", false)
val screenOn = sps.getBoolean("key_switch_on", false)
val editName = sps.getString("key_edit_name", "")

参考

Related Posts

codechachaCopyright ©2019 codechacha