Android快速生成设置/配置页,androidx.preference的使用

👉持续更新,敬请关注......

\color{LightSeaGreen}{做为一个markdown的小白,跪求大佬教下如何制作页内跳转的目录}🙏

一、介绍

  原有的android.support库已经废弃,建议使用androidx.preference,preference是一个非常简洁的设置页面,并且与系统界面拥有高契合度,让用户不会有太多的突兀感。
用官方的话来说就是
  无需与设备存储空间交互,也不需要管理界面,便能构建交互式设置画面。此库自带 Material 主题,可在不同的设备和操作系统版本之间提供一致的用户体验。

二、简单使用

以下将会通过简单的Demo实现Preference的样例

Demo演示图
  • 引入

build.gradle
   // Java language implementation
   implementation "androidx.preference:preference:1.2.0"
   // Kotlin
   implementation "androidx.preference:preference-ktx:1.2.0"
  • MainActivity.java

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings, new SettingFragment())
                .commit();
    }
}
  • activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/settings"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
  • SettingFragment.java

import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;

public class SettingFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener {
    private SharedPreferences sharedPreferences = null;
    private Preference loginDjiAccount;

    @Override
    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
        setPreferencesFromResource(R.xml.pref_setting, rootKey);
        //用于取值的SharedPreferences 
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
        initView();
    }

    private void initView() {
        loginDjiAccount = findPreference("login_dji_account");
        if (loginDjiAccount != null) {
            loginDjiAccount.setOnPreferenceClickListener(this);
        }
    }

    @Override
    public boolean onPreferenceClick(@NonNull Preference preference) {
        switch (preference.getKey()) {
            case "login_dji_account":
                String rtmpUrlStr = sharedPreferences.getString("rtmp_url_pre", "");
                if ("".equals(rtmpUrlStr)) {
                    Toast.makeText(getActivity(), "请在直播推流地址中随意填写值,再来点我...", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getActivity(), "填写了:" + rtmpUrlStr, Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
        return false;
    }
}
  • pref_setting.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">
    <PreferenceCategory app:title="DJI账户">
        <Preference
            app:key="login_dji_account"
            app:summary="点击事件"
            app:title="点我呀" />
        <Preference
            app:enabled="false"
            app:key="logout_dji_account"
            app:title="不可点击" />
    </PreferenceCategory>

    <PreferenceCategory
        app:initialExpandedChildrenCount="0"
        app:title="Dialog类型组件">
        <EditTextPreference
            app:enableCopying="true"
            app:key="rtmp_url_pre"
            app:summary="请设置"
            app:title="直播推流地址"
            app:useSimpleSummaryProvider="true" />
        <ListPreference
            app:enableCopying="true"
            app:entries="@array/finishedAction"
            app:entryValues="@array/finishedAction_values"
            app:key="uav_finishedAction"
            app:summary="返航"
            app:title="任务结束动作"
            app:useSimpleSummaryProvider="true" />
        <MultiSelectListPreference
            app:entries="@array/failSafe"
            app:entryValues="@array/failSafe_values"
            app:key="multi_select_list"
            app:summary="悬停"
            app:title="失控动作" />
    </PreferenceCategory>
    <PreferenceCategory app:title="其他的组件">
        <Preference
            app:summary="点击可以跳转到百度欸"
            app:title="跳转Preference">
            <intent
                android:action="android.intent.action.VIEW"
                android:data="http://www.baidu.com" />
        </Preference>
        <SwitchPreferenceCompat
            app:key="uav_maxFlightRadiusEnabled"
            app:selectable="true"
            app:summary="设置无人机最大可飞行半径距离"
            app:summaryOn="建议关闭此功能,否则将限制设备最大飞行距离"
            app:title="限远开关" />
        <EditTextPreference
            app:dependency="uav_maxFlightRadiusEnabled"
            app:key="uav_maxFlightRadius"
            app:summary="2000"
            app:title="限远(米)"
            app:useSimpleSummaryProvider="true" />
        <Preference
            app:icon="@mipmap/ic_launcher"
            app:key="icon"
            app:summary="可以带Icon的Preference"
            app:title="图标" />
        <Preference
            app:key="single_line_title"
            app:singleLineTitle="true"
            app:summary="但是下面的summary就不行了,它依然还是可以换行的,毕竟是注释信息嘛"
            app:title="这个超级长,并且他不会换行,自带省略号的Preference" />
        <DropDownPreference
            app:entries="@array/finishedAction"
            app:entryValues="@array/finishedAction_values"
            app:key="dropdown"
            app:title="点我!点我!点我!"
            app:useSimpleSummaryProvider="true" />

        <SeekBarPreference
            app:defaultValue="20"
            app:key="seekbar"
            app:title="基本飞行速度(m/s)" />
    </PreferenceCategory>
</PreferenceScreen>

以上为一个简单的Preference的使用
官方API androidx.preference


三、组件的使用

  • \color{HotPink}{PreferenceCategory}

PreferenceCategory
  用于对相似的Preference进行分组的容器。PreferenceCategory显示一个类别标题,将Preference进行分组归类。

PreferenceCategory示例
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
   <PreferenceCategory
       app:icon="@mipmap/ic_launcher"
       app:initialExpandedChildrenCount="0"
       app:key="demo_key"
       app:summary="演示的作用"
       app:title="演示">
       <EditTextPreference
           app:key="setting_name"
           app:title="设置用户名" />
       <SwitchPreference
           app:defaultValue="false"
           app:key="setting_switch"
           app:title="Switch模式" />
       <CheckBoxPreference
           app:summary="选择的内容"
           app:summaryOff="关闭summary"
           app:summaryOn="开启summary"
           app:title="选择项" />
   </PreferenceCategory>
</PreferenceScreen>
key 释义
app:icon 设置图标
app:key 设置key,类似于android:id
app:summary 子标题,类似于注释的作用
app:title 标题
app:enabled true或false,设置是否可操作
app:initialExpandedChildrenCount value为int类型,类似于抽屉效果,int值为不隐藏的数量,与上图中显示高级效果一致
  • \color{HotPink}{Preference}

Preference
  类似于Button。可进行点击,具有大标题、小标题等。

Preference示例
<PreferenceCategory app:title="分组">
       <Preference
           app:key="login_dji_account"
           app:summary="点击事件"
           app:title="点我呀" />
       <Preference
           app:enabled="false"
           app:key="logout_dji_account"
           app:singleLineTitle="true"
           app:title="不可点击,虽然我超级长,但是我就不换行,打我呀" />
   </PreferenceCategory>
key 释义
app:key 设置key,类似于android:id
app:summary 子标题,类似于注释的作用
app:title 标题
app:enabled true或false,设置是否可操作
app:icon 设置图标
app:singleLineTitle 设置为true时,超出屏幕部分自带省略号
  • \color{HotPink}{Dialog}

Dialog类型组件
  点击弹出Dialog组件。常见的有三种,输入框弹窗、单选弹窗、多选弹窗。

单选弹窗.png

多选弹窗.png

输入框弹窗.png

<PreferenceCategory
       app:initialExpandedChildrenCount="0"
       app:title="Dialog类型组件">
         <!--输入框-->
       <EditTextPreference
           app:enableCopying="true"
           app:key="rtmp_url_pre"
           app:summary="请设置"
           app:title="直播推流地址"
           app:useSimpleSummaryProvider="true" />
         <!--单选-->
       <ListPreference
           app:enableCopying="true"
           app:entries="@array/finishedAction"
           app:entryValues="@array/finishedAction_values"
           app:key="uav_finishedAction"
           app:summary="返航"
           app:title="任务结束动作"
           app:useSimpleSummaryProvider="true" />
         <!--多选-->
       <MultiSelectListPreference
           app:entries="@array/failSafe"
           app:entryValues="@array/failSafe_values"
           app:key="multi_select_list"
           app:summary="悬停"
           app:title="失控动作" />
   </PreferenceCategory>
key 释义
app:enableCopying 设置true时,用户可长按复制值
app:key 设置key,类似于android:id
app:summary 子标题,类似于注释的作用
app:title 标题
app:useSimpleSummaryProvider 设置为true时,将会把选中或输入的值显示到summary中
app:entries 该值是将array中的值作为显示值
app:entryValues 当选中某项时,该值作为value进行存储
  • \color{HotPink}{arrays.xml}

将该文件放入value文件夹

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string-array name="finishedAction">
       <item>返航</item>
       <item>悬停</item>
       <item>最后一航点降落</item>
       <item>返回第一航点悬停</item>
   </string-array>
   <string-array name="finishedAction_values">
       <item>GO_HOME</item>
       <item>NO_ACTION</item>
       <item>AUTO_LAND</item>
       <item>GO_FIRST_WAYPOINT</item>
   </string-array>
   <string-array name="failSafe">
       <item>悬停</item>
       <item>降落</item>
       <item>返航</item>
   </string-array>
   <string-array name="failSafe_values">
       <item>HOVER</item>
       <item>LANDING</item>
       <item>GO_HOME</item>
   </string-array>
</resources>
  • \color{HotPink}{可跳转的Preference}

可跳转的Preference
  点击该组件,可跳转网页。

可跳转百度

     <Preference
           app:summary="点击可以跳转到百度欸"
           app:title="跳转Preference">
           <intent
               android:action="android.intent.action.VIEW"
               android:data="http://www.baidu.com" />
       </Preference>
key 释义
app:summary 子标题,类似于注释的作用
app:title 标题
intent 跳转组件
intent:data 跳转地址
  • \color{HotPink}{SwitchPreferenceCompat}

SwitchPreferenceCompat
  该组件为开关组件,同时可通过该组件控制其他组件是否可操作。

控制开关.png

<SwitchPreferenceCompat
           app:key="uav_maxFlightRadiusEnabled"
           app:summary="设置无人机最大可飞行半径距离"
           app:summaryOn="建议关闭此功能,否则将限制设备最大飞行距离"
           app:title="限远开关" />
       <EditTextPreference
           app:dependency="uav_maxFlightRadiusEnabled"
           app:key="uav_maxFlightRadius"
           app:summary="2000"
           app:title="限远(米)"
           app:useSimpleSummaryProvider="true" />
key 释义
app:key 设置key,类似于android:id
app:summary 子标题,类似于注释的作用,默认值
app:app:summaryOn 打开时所显示的副标题
app:app:summaryOff 关闭时所显示的副标题
app:title 标题
app:dependency 填写所属上级的id,可被填写ID的控件控制
  • \color{HotPink}{DropDownPreference}

DropDownPreference
  该组件为下拉按钮弹窗,点击弹出的下拉弹窗将会在按钮旁显示.

点击前.png

点击后.png

       <DropDownPreference
           app:entries="@array/finishedAction"
           app:entryValues="@array/finishedAction_values"
           app:key="dropdown"
           app:title="点我!点我!点我!"
           app:useSimpleSummaryProvider="true" />
key 释义
app:key 设置key,类似于android:id
app:title 标题
app:entries 该值是将array中的值作为显示值
app:entryValues 当选中某项时,该值作为value进行存储
app:useSimpleSummaryProvider 副标题将会采用选中值
  • \color{HotPink}{arrays.xml}

将该文件放入value文件夹

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string-array name="finishedAction">
       <item>返航</item>
       <item>悬停</item>
       <item>最后一航点降落</item>
       <item>返回第一航点悬停</item>
   </string-array>
   <string-array name="finishedAction_values">
       <item>GO_HOME</item>
       <item>NO_ACTION</item>
       <item>AUTO_LAND</item>
       <item>GO_FIRST_WAYPOINT</item>
   </string-array>
   <string-array name="failSafe">
       <item>悬停</item>
       <item>降落</item>
       <item>返航</item>
   </string-array>
   <string-array name="failSafe_values">
       <item>HOVER</item>
       <item>LANDING</item>
       <item>GO_HOME</item>
   </string-array>
</resources>
  • \color{HotPink}{SeekBarPreference}

SeekBarPreference
  该组件为横向滑动条组件.

横向滑动条.png

       <SeekBarPreference
           app:defaultValue="20"
           app:key="seekbar"
           app:title="基本飞行速度(m/s)" />
key 释义
app:key 设置key,类似于android:id
app:title 标题
app:defaultValue 滑动条的默认值

总结

  • 后续会持续进行更新各个属性,敬请关注。
  • 有疑问请留言或通过简信,我会尽快回复。

\color{HotPink}{*注:转载请注明出处.}😡

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容