Android Preference简单介绍
文章目录
- Android Preference简单介绍
- 一、前言
- 二、Preference 简单介绍
- 二、PreferenceScreen和SwitchPreference 简单示例
- 2、相关demo代码示例
- (1)SettingsActivity.Java
- (2)layout\settings_activity.xml
- (3)xml\root_preferences.xml
- (4)build.gradle
- (5)示例demo效果:
- 三、相关内容
- 1、Android的Preference小结
- (1)主要的Preference组件包括:
- (2)与Android Preference相关的开发内容:
- (3)`Preference` 标签属性及其含义
- 2、Preference 其他内容,自行研究部分
- (1)PreferenceCategory
- (2)settingslib自定义类:PrimarySwitchPreference
- (3)settingslib自定义类:AddPreference
- (4)settingslib自定义类:RestrictedPreference和RestrictedSwitchPreference
一、前言
想刀一个人的心是藏不住的,我要吐槽一下Google工程师;
写代码就写代码,Settings代码非要写Preference那套布局.
没怎么学过Preference相关知识,之前很多次想修改获取一直Settings里面的某个功能或者布局就看得蛋疼。
PreferenceScreen、PreferenceCategory、SwitchPreference这个东西,看Settings里面的代码是一脸懵逼。
如果你把Preference相关的类和布局当成普通类,想要修改一两个文件的布局界面和具体事件,
那么你有可能两天都修改不了一个简单的UI效果和它的处理事件。
这种情况,你只要在Android Studio创建一个 Settings项目,里面就包含了Preference 的demo代码,你只要在Studio中修改运行调试代码,再把修改的代码移植到Settings代码就行了。
Android 原生Settings应用用到了大量的Preference显示界面和处理相应是事件,
如果要修改Settings界面了解Preference是非常必要的。
本文带大家伙一起简单入门一下Android Preference的简单使用。
二、Preference 简单介绍
-
Android Preference 是一种可以在Android应用程序中使用的预设用户界面组件,
用于在应用程序中提供一致且易于使用的界面,用于设置和配置应用程序的各个部分。
-
Android Preference提供了几种不同类型的偏好设置,包括复选框、单选按钮、开关和滑块等。
这些偏好设置可以轻松添加到应用程序的用户界面中,并可以使用Android提供的预设样式和布局进行自定义。
要在Android应用程序中使用Preference,您需要在应用程序的XML资源文件中定义每个偏好设置的首选项元素。每个首选项元素都具有唯一的键和显示给用户的值。
当用户更改任何偏好设置时,Android会自动保存更改,并在用户下次启动应用程序时恢复它们。
Android SharePreference 可以保存配置文件到apk数据目录下的xml文件中。
Android Preference 和 SharePreference 的关系在于,当用户通过 Android Preference 用户界面更改设置时,这些更改会保存在 SharePreference 中。
Android Preference 使用 SharePreference 存储和检索每个设置的值。
当用户再次打开应用程序时,Android Preference 会从 SharePreference 中检索先前保存的设置值,并相应地更新用户界面。
简单的说Android的Preference就是一个组件或者一个框架,它能自动记忆某个开关按钮的状态,
比如不加任何Java代码控制的情况,写一个SwitchPreference开关,开关状态改变后后,
退出应用,下次打开应用就会显示上次应用关闭前的开关的状态。
Android Preference 对于 Android 应用程序的开发具有重要的意义,
因为它提供了一种创建一致且易于使用的设置界面的便捷方式。
通过使用 Android Preference,开发人员可以快速为应用程序
的不同设置和配置创建一个熟悉的用户界面,而无需从头开始编写自定义代码。
二、PreferenceScreen和SwitchPreference 简单示例
1、在Android Studio创建一个Preference项目
Android Studio -->File -->New -->new Project -->Settings Activity
如下图所示:
创建好的项目就会有一个xml文件,这个文件专门就是放Preference布局的文件。
2、相关demo代码示例
这个是Android Studio 创建的Settings 类型应用代码,里面就包含了一个Java文件,调试运行很方便。
并且手动添加了一个 SwitchPreference开关,在Java代码里面添加了监听事件。
具体代码如下:
(1)SettingsActivity.Java
package com.demo.settings;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SwitchPreference;
public class SettingsActivity extends AppCompatActivity {
private static final String TAG = "SettingsActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
if (savedInstanceState == null) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
.commit();
}
}
public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
//监听switch开关的状态
SwitchPreference switchPreference = (SwitchPreference) findPreference("ethernet_turn_off");
switchPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean isCheck = (boolean) newValue;
Log.i(TAG, "onPreferenceChange preference = " + preference + ", isCheck = " + isCheck);
return true;
}
});
switchPreference.setSummary("IP:XXX");//副标题,在标题下方,也可以设置空字符串
}
}
}
这里可以看到是使用了一个Preference相关的Fragment放置布局显示。
之前的layout布局要么不用,要么用来放Preference对应的的Fragment。
其实我研究Preference 就是为了添加一个开关:SwitchPreference
(2)layout\settings_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/settings"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
(3)xml\root_preferences.xml
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory app:title="@string/messages_header">
<EditTextPreference
app:key="signature"
app:title="@string/signature_title"
app:useSimpleSummaryProvider="true" />
<ListPreference
app:defaultValue="reply"
app:entries="@array/reply_entries"
app:entryValues="@array/reply_values"
app:key="reply"
app:title="@string/reply_title"
app:useSimpleSummaryProvider="true" />
</PreferenceCategory>
<PreferenceCategory app:title="@string/sync_header">
<SwitchPreferenceCompat
app:key="sync"
app:title="@string/sync_title" />
<SwitchPreferenceCompat
app:dependency="sync"
app:key="attachment"
app:summaryOff="@string/attachment_summary_off"
app:summaryOn="@string/attachment_summary_on"
app:title="@string/attachment_title" />
</PreferenceCategory>
<SwitchPreference
app:key="ethernet_turn_off"
app:title="ethernet_turn_off"
app:summary="ethernet info"/>
</PreferenceScreen>
(4)build.gradle
dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.preference:preference:1.1.1' //Preference的依赖包
}
关键就是要依赖preference的包。
Android 系统源码中Android.bp填入的包:
static_libs: [
"androidx-constraintlayout_constraintlayout",
"androidx.preference_preference", //Preference的依赖包
...],
(5)示例demo效果:
上面demo代码使用到的控件简单介绍:
PreferenceScreen:xml布局界面的根属性
PreferenceCategory:类似layout里面的LinearLayout
EditTextPreference :输入框组件,只在布局文件里面定义,点击条目就可以弹框输入内容,确认后显示在点击的条目上;
ListPreference:列表选择组件,只在布局文件里面定义,点击条目就可以弹框列表内容,确认后显示在点击的条目上;
SwitchPreference: 提供开关按钮功能的组件
SwitchPreferenceCompat: 提供开关按钮功能的组件,是后来随AndroidX Preference库引入的;
SwitchPreference和SwitchPreferenceCompat用法是完全一样的,最新的Preference库也是包含SwitchPreference的;
对于Android新版本比如Android13,SwitchPreferenceCompat兼容性会好一点。
示例demo只是演示效果,很多其他相关的组件可以自己调试研究。
三、相关内容
1、Android的Preference小结
- Android的Preference是一组预设的UI组件,可以让开发者轻松地在应用程序中实现设置界面。
- 它包括各种类型的设置项,如开关、滑动条、单选按钮等。
(1)主要的Preference组件包括:
(1) PreferenceScreen:根节点,代表一个偏好设置的屏幕。它是其他Preference组件的容器。
(2) EditTextPreference:允许用户输入文本值的偏好设置。
(3) CheckBoxPreference(在新版中被`SwitchPreferenceCompat`替代):提供一个开关按钮供用户开启或关闭某个设置。
(4) SwitchPreferenceCompat:与CheckBoxPreference功能类似,提供一个滑动开关供用户切换设置。
(5) ListPreference:显示一个选择列表,用户可以从中选择一个选项作为设置。
(6) MultiSelectListPreference:允许用户从列表中选择多个选项。
(7) PreferenceCategory:用于将偏好设置分组的类别标题。
(8) PreferenceFragmentCompat:一个Fragment,用于在其内部显示一个偏好设置的屏幕。
(2)与Android Preference相关的开发内容:
1. 使用PreferenceFragment实现设置界面:
PreferenceFragment是Android支持库中提供的一种用于实现设置界面的Fragment。
通过继承PreferenceFragment类并重写onCreatePreferences方法,可以轻松地创建设置界面。
2. 使用PreferenceScreen配置设置项:
PreferenceScreen是AndroidManifest.xml文件中的一个元素,用于配置应用程序的设置项。
通过在PreferenceScreen元素中添加不同的元素,可以实现不同类型的设置项。
3. 使用SharedPreferences存储设置数据:
SharedPreferences是Android中提供的一种轻量级的存储方式,用于存储应用程序的设置数据。
通过调用PreferenceFragment类中的getSharedPreferences方法,
可以获取到SharedPreferences对象,并通过编辑器进行数据的读写操作。
4. 使用Preference.OnPreferenceClickListener监听设置项点击事件:
通过为设置项设置OnPreferenceClickListener监听器,可以在用户点击设置项时执行相应的操作。
5. 使用Preference.OnPreferenceChangeListener监听设置项变化事件:
通过为设置项设置OnPreferenceChangeListener监听器,可以在用户修改设置项的值时执行相应的操作。
总之,Android的Preference为开发者提供了一种方便快捷的方式来实现应用程序的设置界面,
通过组合不同的元素和监听器,可以实现丰富的设置项功能。
(3)Preference
标签属性及其含义
在Android开发中,Preference
是用于构建设置界面的一种简便方法。
它允许开发者以声明式的方式在XML文件中定义设置项,而不是手动创建UI。
每个 Preference
标签代表一个设置项,并且有多种属性来定义其行为和外观。
比如下面这个 PreferenceCategory 包含了很多标签属性:
<PreferenceCategory
android:key="multi_network_header"
android:title="@string/summary_placeholder"
android:layout="@layout/preference_category_no_label"
settings:allowDividerBelow="true"
android:order="-40"
settings:controller="com.android.settings.network.MultiNetworkHeaderController"/>
每个Preference 条目都有一些属性,那么这些属性的含义是什么呢?
以下是一些常见的 Preference
标签属性及其含义:
1. key: 这个属性定义了偏好设置的唯一标识符。通过这个键,你可以在代码中检索或更新偏好设置的值。
2. title: 设置项的标题,这是用户在设置界面看到的文本。
3. summary: 设置项的摘要或描述,显示在标题下方,用于提供更多关于设置项的信息。
4. defaultValue: 定义设置项的默认值。当应用第一次运行,且用户尚未更改过该设置时,将使用此默认值。
5. widgetLayout: 允许开发者为偏好设置项指定一个自定义的布局。
6. dependency: 这个属性使当前偏好设置依赖于另一个偏好设置的值。
例如,如果一个偏好设置项被禁用,直到另一个特定的偏好设置被激活/选中。
7. enabled: 控制偏好设置是否可用。默认为 true,即默认情况下是启用状态。
8. selectable: 控制偏好设置项是否可以被选中。默认为 true。
9. icon: 给设置项指定一个图标,以增加可识别性。
10. fragment: 指定当偏好设置被选中时,应该启动的Fragment的全名。这对于构建多层次的设置界面很有用。
上面只是一些主要标签属性,不同的组件还有不同的标签属性。
上面只是介绍了 Preference 的一些简单知识,入门是没有问题的;
但是狗歌开发的Settings会那么简单吗?
Preference相关组件除了Androidx的包定义那些类,
在Settings应用里面还用到了一些的SettingsLib包中自定义的Preference组件,如需要的请自行研究的。
2、Preference 其他内容,自行研究部分
下面都是 network_and_internet.xml里面定义的一些 Preference
package\app\Settings\res\xml\network_and_internet.xml
(1)PreferenceCategory
<PreferenceCategory
android:key="multi_network_header"
android:title="@string/summary_placeholder"
android:layout="@layout/preference_category_no_label"
settings:allowDividerBelow="true"
android:order="-40"
settings:controller="com.android.settings.network.MultiNetworkHeaderController"/>
PreferenceCategory 加 settings :controller是上面意思?
(2)settingslib自定义类:PrimarySwitchPreference
<com.android.settingslib.PrimarySwitchPreference
android:fragment="com.android.settings.wifi.WifiSettings"
android:key="main_toggle_wifi"
android:title="@string/wifi_settings"
android:summary="@string/summary_placeholder"
android:icon="@drawable/ic_settings_wireless"
android:order="-30"
settings:allowDividerAbove="true">
<intent
android:action="android.settings.WIFI_SETTINGS"
android:targetClass="Settings$WifiSettingsActivity" />
</com.android.settingslib.PrimarySwitchPreference>
settingslib包自定义的类,应该是一开关功能的类,添加intent 又是啥操作?
(3)settingslib自定义类:AddPreference
<com.android.settings.widget.AddPreference
android:key="mobile_network_list"
android:title="@string/network_settings_title"
android:summary="@string/summary_placeholder"
android:icon="@drawable/ic_network_cell"
android:order="-15"
settings:keywords="@string/keywords_more_mobile_networks"
settings:userRestriction="no_config_mobile_networks"
settings:useAdminDisabledSummary="true" />
这个是Settings里面自定义的Preference,具体效果和功能要看实现类里面。
(4)settingslib自定义类:RestrictedPreference和RestrictedSwitchPreference
<com.android.settingslib.RestrictedSwitchPreference
android:key="airplane_mode"
android:title="@string/airplane_mode"
android:icon="@drawable/ic_airplanemode_active"
android:disableDependentsState="true"
android:order="-5" settings:controller="com.android.settings.network.AirplaneModePreferenceController"
settings:userRestriction="no_airplane_mode"/>
<com.android.settingslib.RestrictedPreference
android:key="manage_mobile_plan"
android:title="@string/manage_mobile_plan_title"
android:persistent="false"
android:order="19"
settings:userRestriction="no_config_mobile_networks"
settings:useAdminDisabledSummary="true" />
settingslib总共大概有十个左右的自定义类。有用到的可以自己看看。
Android SettingsLib代码位置:
framework\base\packages\SettingsLib\src\com\android\settingslib
在线查看源码网址目录:
http://aospxref.com/android-13.0.0_r3/xref/frameworks/base/packages/SettingsLib/src/com/android/settingslib/
具体某个文件:
http://aospxref.com/android-13.0.0_r3/xref/frameworks/base/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java