LoginSignup
1
2

More than 5 years have passed since last update.

kotlinでandroid入門 ユーザー設定

Posted at

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

この4種類でスマホ内に保存できる方法は全部(のはず)

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2