PreferenceFragmentは以下のような設定画面を簡単に実装するコンポーネントです。非常に少ないコードと簡単なXMLレイアウトのコードを追加して実装することができます。 どのようにPreferenceFragmentを使用するかを知ってみましょう。
プロジェクトの作成
Kotlin
とUse AndroidX artifacts
を選択してください。(Android Studioのバージョンが3.4未満であれば、 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>
今のアプリをビルドして実行してみると、設定画面を見ることができます。
属性
コードのみ貼り付け動作を確認してみました。重要なのは、レイアウトと関連がある 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
を利用します。まず、 PreferenceManager
でgetDefaultSharedPreferences
に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", "")
参考
- サンプルコードは、GitHubにあります
- PreferenceFragment - Android developer
Related Posts
- Android - 振動、Vibrator、VibrationEffectの例
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - PackageManagerにPackage情報を取得する
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - Foreground Service実行
- Android - 時間、日付、変更イベント受信
- Android - currentTimeMillis()、elapsedRealtime()、uptimeMillis()
- Android-PowerManager WakeLock
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - Screen On / Offイベントの受信、状態確認
- Android - 他のアプリのServiceにバインド
- Android - Handler vs Executor
- Android - Darkmode有効にする方法
- Android - hasSystemFeature()、サポートされているFeature確認
- Android - アプリの権限を確認(Permission check)
- Android - インストールされてアプリリストをインポートする
- Android App Shortcuts実装
- Android - ContentProviderを実装、および例
- Android - AIDLを利用して、Remote Serviceの実装
- Android - Uri、Scheme、SSP(Scheme Specific Part)説明
- Android - アプリのインストール、削除、イベントダウンロード(BroadcastReceiverインテントを受け取る)
- Android - SharedPreferencesに簡単なデータを保存する方法
- Android - AlarmManagerにアラームを登録する方法、および例
- Android - Quick SettingsにCustom Tile追加する方法(kotlin)
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android - ネットワーク(WIFI)の接続状態を確認し、変更の検出
- Mockito - static、final methodをmockingする方法
- Andriod - カスタムパーミッションを定義する方法
- RobolectricにUnit Testを作成する(kotlin)
- Android Mockitoのテストコードを作成する(kotlin)
- Android - Handlerの使用方法、および例
- Android - IntentService使用方法
- Android - JobIntentService使用方法