PreferenceFragment 是 Android 提供的一个用于管理应用程序设置的类,可以帮助我们方便地创建、显示和更新应用程序的设置界面。使用 PreferenceFragment 可以避免手动创建设置页面带来的麻烦,并使我们的应用程序更加易于维护和扩展。本文将详细介绍 PreferenceFragment 的使用方法,并提供案例说明。
一、PreferenceFragment 简介
PreferenceFragment 是 Fragment 的一个子类,专门用于显示应用程序的设置界面。它可以自动管理一个 XML 布局文件中定义的各种偏好设置,如 CheckBox、RadioButton、EditText 等等,并接收用户的输入。PreferenceFragment 接口的关键部分是实现 onCreatePreferences() 方法,该方法负责加载偏好设置资源 XML 文件并将其显示在屏幕上。
二、PreferenceFragment 使用方法
1. 创建 PreferenceFragment 类
首先需要创建一个 PreferenceFragment 类,这可以通过继承 PreferenceFragment 来实现:
```java
public class MyPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
```
在上面的代码中,我们继承了 PreferenceFragment,并覆盖了 onCreate() 方法。在 onCreate() 方法中,我们调用了 addPreferencesFromResource() 函数,该函数会解析并将 res/xml/preferences.xml 文件的偏好设置加载到屏幕上。
2. 创建 XML 布局文件
偏好设置资源文件必须定义在 res/xml 目录下,例如:
```xml
android:summary="@string/preferences_summary"> android:title="@string/name_title" android:summary="@string/name_summary" android:dialogTitle="@string/name_dialog_title" android:dialogMessage="@string/name_dialog_message" /> android:title="@string/gender_title" android:summary="@string/gender_summary" android:entries="@array/gender_entries" android:entryValues="@array/gender_values" android:defaultValue="-1" /> android:title="@string/notification_title" android:summary="@string/notification_summary" android:defaultValue="true" /> android:title="@string/ringtone_title" android:summary="@string/ringtone_summary" android:ringtoneType="notification" android:showDefault="true" android:showSilent="true" />
```
上面的 XML 文件描述了一个设置界面,并包含了某些偏好设置选项,例如 EditTextPreference、ListPreference、CheckBoxPreference 等等。在这个示例中,我们创建了两个 PreferenceCategory 组来分类显示控件。
3. 定义主界面布局文件
PreferenceFragment 类需要与一个 Activity 连接才能正常工作。我们需要在主界面布局文件中定义一个 FrameLayout 布局元素,用于显示 PreferenceFragment:
```xml
> ... android:layout_width="match_parent" android:layout_height="match_parent" /> ...
```
如上所示,FrameLayout 的 ID 必须是“fragment_container”,用于让 Activity 找到该布局元素并将其替换为 PreferenceFragment。
4. 在主界面 Activity 中加载 PreferenceFragment
要在主界面 Activity 中加载 PreferenceFragment,我们需要创建一个 FragmentTransaction 对象,并使用 add() 和 commit() 方法添加到 FrameLayout 中:
```java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getFragmentManager().beginTransaction()
.add(R.id.fragment_container, new MyPreferenceFragment())
.commit();
}
}
```
如上所示,我们使用了 add() 方法将 MyPreferenceFragment 添加到 FragmentTransaction 中,并使用 commit() 方法提交更改。最后,在 activity_main.xml 布局文件中找到 fragment_container,并将其与 MyPreferenceFragment 显示在一起。
5. 接收用户输入
一旦 PreferenceFragment 显示在屏幕上,用户就可以通过选择 CheckBox、RadioButton、EditText 等控件来输入偏好设置。当用户保存或取消对偏好设置的更改时,PreferenceFragment 会自动更新偏好设置文件,并返回到主界面 Activity。如果需要在偏好设置更改之前更新某些应用程序状态,可以注册 OnSharedPreferenceChangeListener 接口的实现:
```java
public class MainActivity extends AppCompatActivity implements
SharedPreferences.OnSharedPreferenceChangeListener {
...
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// 重新加载偏好设置
getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, new MyPreferenceFragment())
.commit();
}
}
```
如上所示,我们注册了 OnSharedPreferenceChangeListener 接口,并在 onSharedPreferenceChanged() 方法中重新加载 PreferenceFragment。由于当偏好设置更改时会触发该方法,因此重新加载偏好设置可以让用户在设置更改后立即看到更改后的值。
三、PreferenceFragment 应用案例
现在,让我们来看一个实际的 PreferenceFragment 应用案例。
1. 创建工程和偏好设置资源文件
我们首先需要创建一个新的 Android 工程,并创建一个偏好设置 XML 文件(preferences.xml)。在偏好设置资源文件中添加以下代码:
```xml
android:title="@string/preferences_username_title" android:summary="@string/preferences_username_summary" android:negativeButtonText="@null" android:dialogTitle="@string/preferences_username_dialog_title" /> android:title="@string/preferences_password_title" android:summary="@string/preferences_password_summary" android:inputType="textPassword" android:negativeButtonText="@null" android:dialogTitle="@string/preferences_password_dialog_title" /> android:title="@string/preferences_city_title" android:entries="@array/preferences_city_entries" android:entryValues="@array/preferences_city_values" android:defaultValue="Paris" /> android:title="@string/preferences_notifications_title" android:summary="@string/preferences_notifications_summary" android:defaultValue="true" /> android:title="@string/preferences_ringtone_title" android:summary="@string/preferences_ringtone_summary" android:entries="@array/preferences_ringtone_entries" android:entryValues="@array/preferences_ringtone_values" android:dependency="notifications" android:defaultValue="Mute" />
```
在上面的代码中,我们创建了两个 PreferenceCategory,用来添加 Settings 应用中的通用和通知相关偏好设置。它包括 EditTextPreference、ListPreference 和 SwitchPreference 等控件。我们还使用数组资源文件将它们的值添加到 ListPreference。
2. 创建 PreferenceFragment 类
我们创建一个名为 SettingsFragment 的 PreferenceFragment 类,如下所示:
```java
public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onResume() {
super.onResume();
// 注册偏好设置更改监听
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
// 注销偏好设置更改监听
getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(getString(R.string.preferences_notifications_key))) {
Preference notificationsPreference = findPreference(key);
if (notificationsPreference != null) {
Boolean enabled = sharedPreferences.getBoolean(key, true);
if (enabled) {
notificationsPreference.setSummary(R.string.preferences_notifications_summary);
} else {
notificationsPreference.setSummary(getString(R.string.preferences_notifications_summary_disabled));
}
}
} else if (key.equals(getString(R.string.preferences_ringtone_key))) {
Preference ringtonePreference = findPreference(key);
if (ringtonePreference != null) {
String value = sharedPreferences.getString(key, "");
int prefIndex = ((ListPreference) ringtonePreference).findIndexOfValue(value);
if (prefIndex >= 0) {
CharSequence[] entries = ((ListPreference) ringtonePreference).getEntries();
ringtonePreference.setSummary(entries[prefIndex]);
}
}
}
}
}
```
在上面的代码中,我们继承了 PreferenceFragment 类,并将偏好设置资源文件加载进来。我们还通过 onResume() 和 onPause() 方法来注册和注销偏好设置更改的监听器。
在 onSharedPreferenceChanged() 方法中,我们实现了 SharedPreferences.OnSharedPreferenceChangeListener 接口,并在偏好设置更改的时候触发该方法。在这个方法中,我们可以通过 key 值找到名为 key 的 Preference,并更新其显示值。
3. 在主界面 Activity 中加载 PreferenceFragment
打开名为 MainActivity 的主界面 Activity,并在其中添加以下代码:
```java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}
```
如上所示,我们使用了 FragmentTransaction 对象通过 replace() 方法将主界面 Activity 中的内容替换为 SettingsFragment。
4. 运行
现在我们启动该应用程序,并在主界面 Activity 中看到以下设置:
![preferencefragment1](https://user-images.githubusercontent.com/45085199/115167671-e6bc7e00-a0fc-11eb-8c45-dc65179860a3.png)
我们可以点击“用户名”控件,打开一个对话框来编辑字段的值。点击“密码”时,我们可以输入密码,但它被遮盖了。在“城市”列表中,我们可以选择城市。
在“通知”部分,我们可以启用或禁用通知,并选择铃声。当我们按下后退按钮并返回主屏幕时,偏好设置更改将自动保存。
在设置更改之后,它应该会像下面这样展示:
![preferencefragment2](https://user-images.githubusercontent.com/45085199/115167813-297e5600-a0fd-11eb-89fa-900c4a6d4963.png)
四、总结
PreferenceFragment 是一种快速简便的方法,通过这种方式可以轻松创建和管理应用程序的设置。本文对 PreferenceFragment 的使用方法进行了详细地介绍,并提供了一个具体的应用案例,希望对 Android 开发者们有所帮助。
壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。
我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复