kotlinでandroid入門 ユーザー設定

スマホ内に保存できるデータの種類として
・プリファレンス
・内部ストレージ
・データベース
ときて、残りは
・アプリ用の設定

この４種類でスマホ内に保存できる方法は全部（のはず）

### 1. ユーザー設定画面の呼び出し

AppCompatActivityのクラスの onCreate()から

```
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_user_seting)

        // ユーザー設定を呼び出し
        val tsp = user_parameters()
        fragmentManager.beginTransaction()
                .replace(R.id.fragment_container, tsp )
                .commit()
    }
```


### 2. ユーザー設定画面の側

PreferenceFragment を使って行うパターン

バーも表示して他の画面と見た目を揃えたかったので
xmlに Toolbar と　FrameLayout　を配置したものを用意

```activity_user_seting.xml 
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/set_toolbar"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="?attr/colorPrimary"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <!--  設定項目 : 表示する位置のみ、実際の内容は別に記載 -->
    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/set_toolbar"
        app:layout_constraintTop_toBottomOf="@+id/set_toolbar" />

</android.support.constraint.ConstraintLayout>
```


### 3. 処理

実際の処理は　user_parameters で行う

  Preference は
  PreferenceActivity ではなく  PreferenceFragment が推奨
  PreferenceFragmentCompat は SupportLibrary v23から無くなった

```
class user_parameters  : PreferenceFragment() {
    //
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 表示情報を追加
        addPreferencesFromResource(R.xml.parameters_seting)

        // 今のデータを呼び出して表示(サマリー)
        val switch = findPreference(getString(R.string.parameter_key_switch)) as SwitchPreference
        switch.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, value ->
            // 変更された場合は、表示を更新
            preference.summary = value.toString()

            // 値により、設定できる項目を変更
            val otherSettingsPreference = findPreference(getString(R.string.parameter_gr_setint2))
            otherSettingsPreference.isEnabled = value as Boolean

            true
        }
        switch.summary=switch.isChecked.toString()

        //
        val checkbox = findPreference(getString(R.string.parameter_key_checkbox)) as CheckBoxPreference
        checkbox.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, value ->
            preference.summary = value.toString()

            // 値により、設定できる項目を変更
            val otherSettingsPreference = findPreference(getString(R.string.parameter_gr_setint3))
            otherSettingsPreference.isEnabled = value as Boolean

            true
        }
        checkbox.summary=checkbox.isChecked.toString()

        // テキストが変更されたらサマリも更新する
        val text = findPreference(getString(R.string.parameter_key_text)) as EditTextPreference
        text.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, value ->
            preference.summary = value as CharSequence
            true
        }
        text.summary = text.text

        //
        val number = findPreference(getString(R.string.parameter_key_number)) as EditTextPreference
        number.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, value ->
            preference.summary = value as CharSequence
            true
        }
        number.summary = number.text

        val listSel = findPreference(getString(R.string.parameter_key_list)) as ListPreference
        listSel.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, value ->
            preference.summary = value as CharSequence
            true
        }
        listSel.summary = listSel.value


        findPreference(getString(R.string.parameter_gr_setint2)).isEnabled = switch.isChecked
        findPreference(getString(R.string.parameter_gr_setint3)).isEnabled = checkbox.isChecked
    }
}
```

### 4. 実際の設定項目の画面

```
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
        android:title="@string/parameter_intfo_gr_onof">

        <SwitchPreference
            android:key="@string/parameter_key_switch"
            android:title="@string/parameter_info_switch"
            android:defaultValue="false" />

        <CheckBoxPreference
            android:key="@string/parameter_key_checkbox"
            android:title="@string/parameter_info_chkbox"
            android:defaultValue="false" />
    </PreferenceCategory>

    <PreferenceCategory
        android:key="@string/parameter_gr_setint2"
        android:title="@string/parameter_info_gr_text"
        android:enabled="false" >

        <EditTextPreference
            android:key="@string/parameter_key_text"
            android:title="@string/parameter_info_text"
            android:text ="@string/parameter_info_text"
            />

        <EditTextPreference
            android:key="@string/parameter_key_number"
            android:title="@string/parameter_info_text"
            android:text="0"
            android:inputType="number"
            android:maxLength="3" />

    </PreferenceCategory>

    <PreferenceCategory
        android:key="@string/parameter_gr_setint3"
        android:title="@string/parameter_info_gr_sel"
        android:enabled="false" >

        <ListPreference
            android:key="@string/parameter_key_list"
            android:title="@string/parameter_info_list"
            android:entries="@array/week_entries"
            android:entryValues="@array/week_values"
            android:defaultValue="@string/Sun" />

        <MultiSelectListPreference
            android:key="@string/parameter_key_multi"
            android:title="@string/parameter_info_multi"
            android:entries="@array/planet_entries"
            android:entryValues="@array/planet_values" />

    </PreferenceCategory>
</PreferenceScreen>
```

こんな感じ
![seting.png](https://qiita-image-store.s3.amazonaws.com/0/258658/b0cd1386-e211-6037-5624-f7cd3a3866e1.png)