一场与Preference的战争
- 一、介绍
- 二、简单使用
- 以下将会通过简单的Demo实现Preference的样例
- 引入
- build.gradle
- MainActivity.java
- activity_main.xml
- SettingFragment.java
- pref_setting.xml
- 三、组件的使用
-
P
r
e
f
e
r
e
n
c
e
C
a
t
e
g
o
r
y
\color{HotPink}{ PreferenceCategory }
PreferenceCategory
-
P
r
e
f
e
r
e
n
c
e
\color{HotPink}{Preference}
Preference
-
D
i
a
l
o
g
\color{HotPink}{Dialog}
Dialog
-
a
r
r
a
y
s
.
x
m
l
\color{HotPink}{arrays.xml}
arrays.xml
-
可
跳
转
的
P
r
e
f
e
r
e
n
c
e
\color{HotPink}{可跳转的Preference}
可跳转的Preference
-
S
w
i
t
c
h
P
r
e
f
e
r
e
n
c
e
C
o
m
p
a
t
\color{HotPink}{SwitchPreferenceCompat}
SwitchPreferenceCompat
-
D
r
o
p
D
o
w
n
P
r
e
f
e
r
e
n
c
e
\color{HotPink}{DropDownPreference}
DropDownPreference
-
a
r
r
a
y
s
.
x
m
l
\color{HotPink}{arrays.xml}
arrays.xml
-
S
e
e
k
B
a
r
P
r
e
f
e
r
e
n
c
e
\color{HotPink}{SeekBarPreference}
SeekBarPreference
- 总结
-
∗
注
:
转
载
请
注
明
出
处
.
\color{HotPink}{*注:转载请注明出处.}
∗注:转载请注明出处.😡
👉持续更新,敬请关注…
一、介绍
原有的android.support库已经废弃,建议使用androidx.preference,preference是一个非常简洁的设置页面,并且与系统界面拥有高契合度,让用户不会有太多的突兀感。
用官方的话来说就是
无需与设备存储空间交互,也不需要管理界面,便能构建交互式设置画面。此库自带 Material 主题,可在不同的设备和操作系统版本之间提供一致的用户体验。
二、简单使用
以下将会通过简单的Demo实现Preference的样例
build.gradle
// Java language implementation
implementation "androidx.preference:preference:1.2.0"
// Kotlin
implementation "androidx.preference:preference-ktx:1.2.0"
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();
}
}
<?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>
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;
}
}
<?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
三、组件的使用
-
P
r
e
f
e
r
e
n
c
e
C
a
t
e
g
o
r
y
\color{HotPink}{ PreferenceCategory }
PreferenceCategory
PreferenceCategory
用于对相似的Preference进行分组的容器。PreferenceCategory显示一个类别标题,将Preference进行分组归类。
<?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值为不隐藏的数量,与上图中显示 高级 效果一致 |
-
P
r
e
f
e
r
e
n
c
e
\color{HotPink}{Preference}
Preference
Preference
类似于Button。可进行点击,具有大标题、小标题等。
<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时,超出屏幕部分自带省略号 |
-
D
i
a
l
o
g
\color{HotPink}{Dialog}
Dialog
Dialog类型组件
点击弹出Dialog组件。常见的有三种,输入框弹窗、单选弹窗、多选弹窗。
<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进行存储 |
-
a
r
r
a
y
s
.
x
m
l
\color{HotPink}{arrays.xml}
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>
-
可
跳
转
的
P
r
e
f
e
r
e
n
c
e
\color{HotPink}{可跳转的Preference}
可跳转的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 | 跳转地址 |
-
S
w
i
t
c
h
P
r
e
f
e
r
e
n
c
e
C
o
m
p
a
t
\color{HotPink}{SwitchPreferenceCompat}
SwitchPreferenceCompat
SwitchPreferenceCompat
该组件为开关组件,同时可通过该组件控制其他组件是否可操作。
<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的控件控制 |
-
D
r
o
p
D
o
w
n
P
r
e
f
e
r
e
n
c
e
\color{HotPink}{DropDownPreference}
DropDownPreference
DropDownPreference
该组件为下拉按钮弹窗,点击弹出的下拉弹窗将会在按钮旁显示.
<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 | 副标题将会采用选中值 |
-
a
r
r
a
y
s
.
x
m
l
\color{HotPink}{arrays.xml}
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>
-
S
e
e
k
B
a
r
P
r
e
f
e
r
e
n
c
e
\color{HotPink}{SeekBarPreference}
SeekBarPreference
SeekBarPreference
该组件为横向滑动条组件.
<SeekBarPreference
app:defaultValue="20"
app:key="seekbar"
app:title="基本飞行速度(m/s)" />
key | 释义 |
---|
app:key | 设置key,类似于android:id |
app:title | 标题 |
app:defaultValue | 滑动条的默认值 |
总结
- 后续会持续进行更新各个属性,敬请关注。
- 有疑问请留言或通过私信,我会尽快回复。
∗
注
:
转
载
请
注
明
出
处
.
\color{HotPink}{*注:转载请注明出处.}
∗注:转载请注明出处.😡
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)