Android Preference的使用以及解析

简单使用

  1. values.arrays.xml
xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="list_entries">
        <item>Option 1</item>
        <item>Option 2</item>
        <item>Option 3</item>
    </string-array>
    <string-array name="list_values">
        <item>1</item>
        <item>2</item>
        <item>3</item>
    </string-array>
</resources>
  1. xml.preferences.xml
xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <Preference
        android:key="simple_preference"
        android:summary="This is a simple preference"
        android:title="Simple Preference" />
    <CheckBoxPreference
        android:defaultValue="false"
        android:key="checkbox_preference"
        android:summary="This is a CheckBox"
        android:title="Check Box Preference" />
    <EditTextPreference
        android:dialogTitle="Enter Text"
        android:key="edittext_preference"
        android:summary="Enter your text here"
        android:title="Edit Text Preference" />
    <ListPreference
        android:defaultValue="1"
        android:entries="@array/list_entries"
        android:entryValues="@array/list_values"
        android:key="list_preference"
        android:summary="Select an option"
        android:title="List Preference" />
    <com.example.kotlinlearn.Preference.CustomSeekBarPreference
        android:defaultValue="50"
        android:key="seekbar_preference"
        android:title="SeekBar Preference" />
</PreferenceScreen>
  1. SettingsFragment
kotlin 复制代码
package com.example.kotlinlearn.Preference
import android.os.Bundle
import android.util.Log
import androidx.preference.CheckBoxPreference
import androidx.preference.EditTextPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import com.example.kotlinlearn.R
class SettingsFragment : Preference.OnPreferenceClickListener,
    Preference.OnPreferenceChangeListener, PreferenceFragmentCompat() {
    var TAG = "SettingsFragment"
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
        var findPreference = findPreference<EditTextPreference>("edittext_preference")
        findPreference?.onPreferenceClickListener = this
        findPreference?.onPreferenceChangeListener = this
    }

    override fun onPreferenceClick(preference: Preference?): Boolean {
        Log.d(TAG, "onPreferenceClick: ")
        return false
    }

    override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean {
        Log.d(TAG, "onPreferenceChange: ")
        return false
    }
}
  1. PreferenceActivity
java 复制代码
package com.example.kotlinlearn.Preference

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.kotlinlearn.R

class PreferenceActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_preference)

        // Display the fragment as the main content.
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.fragment_container, SettingsFragment())
            .commit()
    }
}

效果

原理

  1. 布局:RecyclerView进行布局,PreferenceGroupAdapter,重写onCreateViewHolder()、onBindViewHolder()、getItemCount()
    在onCreateViewHolder(ViewGroup parent, int viewType) 中根据viewType判断获取不同的preference。
  2. Preference:底层调用SharedPreferences进行保存。通过以下方法持久化数值。
    persistString,persistStringSet,persistInt,persistFloat,persistLong,persistBoolean

自定义Preference

重点在监听view变化,在变化后通过回调,将终值写入SharedPreferences,在初始化的时候读出值并赋给view。

kotlin 复制代码
package com.example.kotlinlearn.Preference


import android.content.Context
import android.content.res.TypedArray
import android.util.AttributeSet
import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder
import android.widget.SeekBar
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.kotlinlearn.R

class CustomSeekBarPreference(context: Context, attrs: AttributeSet) : Preference(context, attrs) {

    private var currentValue: Int = 0
    private var maxValue: Int = 100

    init {
        widgetLayoutResource = R.layout.preference_seekbar
    }

    override fun onBindViewHolder(holder: PreferenceViewHolder) {
        super.onBindViewHolder(holder)
        val seekBar = holder.findViewById(R.id.seekbar) as SeekBar
        val valueText = holder.findViewById(R.id.seekbar_value) as TextView

        seekBar.max = maxValue
        seekBar.progress = currentValue

        valueText.text = currentValue.toString()

        seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                currentValue = progress
                valueText.text = progress.toString()
                persistInt(progress)
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {}
            override fun onStopTrackingTouch(seekBar: SeekBar?) {}
        })
    }

    override fun onGetDefaultValue(a: TypedArray, index: Int): Any {
        return a.getInt(index, 0)
    }

    override fun onSetInitialValue(defaultValue: Any?) {
        currentValue = getPersistedInt(defaultValue as? Int ?: 0)
    }
}

ex:

1.当xml中设置组件的id相同时,会导致多个preference的值相同。

相关推荐
聚美智数3 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
mmsx8 小时前
Android 插件化架构:40 个 Gradle 模块的拆分、通信与共存
android·kotlin
mmsx8 小时前
Android 不改一行源码:用 AspectJ 做三类拦截
android·kotlin
TST-魚爷8 小时前
易视讯会议摄像头 + 全向麦克风实操讲解稿
android·电脑·钉钉·腾讯会议·zoom会议
嘟哩DuliDuli9 小时前
AI创作工作区的项目上下文与多模态任务边界
android·人工智能·安全·ai·软件工程
imDwAaY10 小时前
MySQL 存储引擎是什么?
android·数据库·mysql
熊猫钓鱼>_>11 小时前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
Meteors.11 小时前
Android Compose学习02:基础组件与 Modifier
android·学习
其实防守也摸鱼12 小时前
存储管理:页面置换算法学习任务(测验题要求给出置换页面顺序,缺页次数,缺页率)
android·前端·数据库·学习·oracle·自动化
mmsx14 小时前
Android 地图上绘制 KML:解析、样式与渲染
android·xml