金丹篇:设置界面的开发利器Preference Library,了解一下~

268 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

接下来会对Preference Library官方库进行一个系列讲解,本篇文章是Preference Library系列的第三篇,主要是介绍Preference Library中如何实现各式各样的点击事件。

历史文章

练气篇:设置界面的开发利器Preference Library,了解一下~

筑基篇:设置界面的开发利器Preference Library,了解一下~

一. 借助app:fragment跳转到其他fragment界面

平常设置界面开发中,也会通过某个设置项跳转到某个更加详细设置界面,比如我们常用的手机上的设置界面中,点击开发者选项就会跳转到开发者专门使用的设置界面,这个需求我们可以直接通过app:fragment实现。

首先我们在主设置界面提供一个开发者选项入口:

<Preference
    app:fragment="com.example.m3demo.DevelopFragment"
    app:icon="@drawable/ic_launcher_foreground"
    app:key="develop"
    app:title="开发者选项" />

通过app:fragment设置了该设置项需要跳转的界面为DevelopFragment界面。 DevelopFragment界面的设置项配置如下:

<?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">
    
    <SwitchPreferenceCompat
        app:key="test_usb"
        app:title="选择是否开启USB调试" />

    <Preference
        app:key="dongjie"
        app:title="墓碑模式" />

</PreferenceScreen>
class DevelopFragment: PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.sync_settings, rootKey)

    }
}

上面配置完就实现了基本功能,系统会调用接口方法 PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment()(系统会帮助我们默认实现)实现界面跳转,我们看下实现效果:

image.png e4c1f129c614e156f447e6684ed1548.jpg

虽然系统会帮助我们实现PreferenceFragmentCompat.OnPreferenceStartFragmentCallback.onPreferenceStartFragment(),但是官方界面我们自己实现这个接口:

image.png

比如我们会经常用到切换设置界面后,顶部的标题也要发生界面,自定义这个接口就非常方便是这个功能等等。接下来我们看下如何实现:

Activity实现PreferenceFragmentCompat.OnPreferenceStartFragmentCallback接口并重写onPreferenceStartFragment()方法:

class DialogActivity : AppCompatActivity(),
    PreferenceFragmentCompat.OnPreferenceStartFragmentCallback{   
    
    override fun onPreferenceStartFragment(
        caller: PreferenceFragmentCompat,
        pref: Preference
    ): Boolean {
        //创建指定fragment
        val fragment = supportFragmentManager.fragmentFactory.instantiate(
            classLoader,
            pref.fragment!!
        )
        supportFragmentManager.commit {
            replace(R.id.contentFl, fragment)
            //添加到返回栈
            addToBackStack(null)
        }
        return true
    }
}

如果想要向这个跳转的界面传递参数 ,可以在这个设置项下配置extra标签:

<Preference
    app:icon="@drawable/ic_launcher_foreground"
    app:key="develop"
    app:title="开发者选项">
    
    <extra
        android:name="key1"
        android:value="value1"/>

    <extra
        android:name="key2"
        android:value="value3"/>
</Preference>

二. 借助跳转到其他Activity界面

比如我们单独创建Activity界面显示开发者设置页:

<Preference
    app:icon="@drawable/ic_launcher_foreground"
    app:key="develop"
    app:title="开发者选项">

    <intent
        android:targetClass="com.example.m3demo.DevelopActivity"
        android:targetPackage="com.example.m3demo" />
</Preference>

我们指定了跳转到DevelopActivity界面,其中还可以配置根据action等等进行跳转,实现效果和上面的差不多。

三. 借助setOnPreferenceClickListener()实现点击事件

findPreference<Preference>("develop")?.let {
    it.setOnPreferenceClickListener {
        //自定义一些点击事件处理
        return@setOnPreferenceClickListener true
    }
}

总结

本篇文章主要讲解了实现设置项点击事件的三种方式,大家可以根据业务场景选择合适的实现,希望本篇文章能对你有所帮助,如果觉得还不错,可以点个赞哈。