Android实战技巧之六:PreferenceActivity使用详解

PreferenceActivity是Android系统提供的一种方便快捷地实现设置界面的方式,由系统自动实现存储设置数据到SharedPreferences中,并支持多种设置项类型、布局和样式。在本篇文章中,我们将为大家详细介绍PreferenceActivity的使用方法,并提供案例说明。

一、PreferenceActivity的基本使用方法

1. 创建PreferenceActivity

创建一个PreferenceActivity的方式与创建Activity类似,需要声明Activity类并在AndroidManifest.xml文件中添加相应的配置。示例代码如下:

```java

public class SettingsActivity extends PreferenceActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 设置Preference页面的布局文件

addPreferencesFromResource(R.xml.preferences);

}

}

```

2. 配置Preference页面

在res/xml目录下创建preferences.xml文件,定义Preference页面的布局和设置项。以下是一个简单的示例:

```xml

android:key="username"

android:title="用户名"

android:summary="请输入用户名"

android:dialogTitle="输入用户名"

android:dialogMessage="请输入用户名"

android:defaultValue="admin"/>

android:key="notifPref"

android:title="消息通知"

android:summary="是否需要消息通知"

android:defaultValue="true"/>

android:key="ringtonePref"

android:title="铃声设置"

android:summary="请选择一个铃声"

android:entries="@array/ringtone_titles"

android:entryValues="@array/ringtone_values"

android:defaultValue="default"/>

```

3. 处理设置项变化

处理设置项变化的方式与处理Activity回调类似,只需要在PreferenceActivity中实现onSharedPreferenceChanged()方法即可。在该方法中,可以根据传入的key获取对应的Preference对象,并从中获取最新的设置项值。

```java

public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferences);

}

@Override

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

if (key.equals("notifPref")) {

boolean notifPref = sharedPreferences.getBoolean(key, true);

// 处理消息通知设置变化

} else if (key.equals("ringtonePref")) {

String ringtonePref = sharedPreferences.getString(key, "default");

// 处理铃声设置变化

}

}

@Override

protected void onResume() {

super.onResume();

getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

}

@Override

protected void onPause() {

super.onPause();

getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);

}

}

```

二、Preference页面布局和设置项样式

1. Preference页面布局

Preference页面的布局样式由xml文件定义,可以使用以下标签:

- PreferenceScreen:最外层的布局标签,在其中添加设置项。

- PreferenceCategory:组合设置项的容器,可以用来对一类设置项分组显示。

- Preference:单个设置项的布局标签,可以使用不同的子标签来定义不同的设置项类型。

示例代码:

```xml

android:title="第一组设置">

android:key="setting_1"

android:title="CheckBox"

android:summary="CheckBoxPreference" />

android:key="setting_2"

android:title="EditText"

android:summary="EditTextPreference"

android:dialogTitle="输入框标题"

android:dialogMessage="输入框说明"

android:defaultValue="默认值" />

```

2. 设置项样式

除了布局以外,每一项设置项还可以设置不同的样式,例如:

- android:title:设置项标题。

- android:summary:设置项摘要。

- android:key:设置项的键,用于存储和获取设置项的值。

- android:defaultValue:设置项的默认值。

- ...

示例代码:

```xml

android:title="CheckBoxPreference"

android:summary="摘要文字"

android:key="setting_1"

android:defaultValue="false" />

```

三、Preference页面的事件处理

1. 点击保存按钮事件

在Preference页面中点击保存按钮时,会自动保存所有设置项的值并退出页面,此时会触发PreferenceActivity的onBackPressed()方法。

```java

@Override

public void onBackPressed() {

setResult(Activity.RESULT_OK);

super.onBackPressed();

}

```

2. 设置项的变化事件

当用户修改某一个设置项的值时,会自动触发onSharedPreferenceChanged()方法,从而实现对应的逻辑处理。

```java

SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {

@Override

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

// 处理设置项变化事件

}

};

```

四、Preference页面的高级使用技巧

1. 自定义Preference页面布局

如果系统提供的布局样式无法满足需求,可以自定义Preference页面的布局文件,并在PreferenceActivity中设置。示例代码如下:

```java

public class CustomPreferenceActivity extends PreferenceActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.custom_preferences);

Toolbar toolbar = findViewById(R.id.toolbar);

toolbar.setTitle(R.string.preferences);

setSupportActionBar(toolbar);

getFragmentManager().beginTransaction().replace(R.id.preferences, new SettingsFragment()).commit();

}

public static class SettingsFragment extends PreferenceFragment {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferences);

}

}

}

```

对应的布局文件custom_preferences.xml:

```xml

android:orientation="vertical"

android:id="@+id/background">

android:id="@+id/toolbar"

android:layout_width="match_parent"

android:layout_height="?actionBarSize"

android:background="?attr/colorPrimary"

android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"

android:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

android:id="@+id/preferences"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@color/background_color"/>

```

2. 自定义Preference项

可以继承Preference类并重写它的onBindView()方法来自定义Preference项。

```java

public class CustomPreference extends Preference {

private TextView mTitleView;

public CustomPreference(Context context, AttributeSet attrs) {

super(context, attrs);

setLayoutResource(R.layout.custom_preference);

}

@Override

public void onBindView(View view) {

super.onBindView(view);

mTitleView = (TextView) view.findViewById(R.id.title);

if (mTitleView != null) {

mTitleView.setText(getTitle());

}

}

}

```

对应的布局文件custom_preference.xml:

```xml

android:id="@+id/title"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:textColor="@color/text_color"

android:textSize="@dimen/text_size" />

```

3. 动态加载Preference项

在PreferenceActivity中,可以使用PreferenceScreen对象的addPreference()方法动态加载Preference项。

```java

PreferenceScreen screen = getPreferenceScreen();

Preference preference = new Preference(this);

preference.setKey("dynamic_preference");

preference.setTitle("Dynamic Preference");

preference.setSummary("This preference is added dynamically");

preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {

@Override

public boolean onPreferenceClick(Preference preference) {

// 处理点击事件

return true;

}

});

screen.addPreference(preference);

```

四、Preference页面的案例说明

1. 创建新建便签的设置页面

我们可以利用Preference页面方便地创建一个新建便签的设置页面,包含标题、内容、时间等多个设置项。示例代码如下:

```java

public class NoteSettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

private EditTextPreference mTitlePref;

private EditTextPreference mContentPref;

private CheckBoxPreference mReminderPref;

private ListPreference mColorPref;

private TimePickerPreference mTimePref;

private RingtonePreference mRingtonePref;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.note_settings);

mTitlePref = (EditTextPreference) findPreference("title_pref");

mContentPref = (EditTextPreference) findPreference("content_pref");

mReminderPref = (CheckBoxPreference) findPreference("reminder_pref");

mColorPref = (ListPreference) findPreference("color_pref");

mTimePref = (TimePickerPreference) findPreference("time_pref");

mRingtonePref = (RingtonePreference) findPreference("ringtone_pref");

}

@Override

protected void onResume() {

super.onResume();

// 注册Preference项变化监听器

getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

}

@Override

protected void onPause() {

super.onPause();

// 移除Preference项变化监听器

getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);

}

@Override

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

// 处理Preference项变化事件

if (key.equals("reminder_pref")) {

boolean isChecked = mReminderPref.isChecked();

mTimePref.setEnabled(isChecked);

mRingtonePref.setEnabled(isChecked);

} else if (key.equals("time_pref")) {

int hour = mTimePref.getHour();

int minute = mTimePref.getMinute();

// 处理时间设置变化事件

}

}

}

```

对应的布局文件note_settings.xml:

```xml

android:key="title_pref"

android:title="@string/note_title"

android:summary="@string/note_title_hint" >

android:key="content_pref"

android:title="@string/note_content"

android:summary="@string/note_content_hint">

android:key="color_pref"

android:title="@string/note_color"

android:summary="@string/note_color_hint"

android:entries="@array/note_color_entries"

android:entryValues="@array/note_color_values"

android:defaultValue="@string/note_color_default">

android:key="reminder_pref"

android:title="@string/note_remind_me"

android:summary="@string/note_reminder_hint">

android:key="reminder_time_screen"

android:title="@string/note_reminder_time"

android:summary="@string/note_reminder_time_hint">

android:key="time_pref"

android:dialogTitle="@string/note_reminder_time"

android:dialogMessage="@string/note_reminder_time_hint"/>

android:key="ringtone_pref"

android:title="@string/note_reminder_sound"

android:summary="@string/note_reminder_sound_hint"

android:dialogTitle="@string/note_reminder_sound"

android:ringtoneType="notification|ringtone"

android:showDefault="true"

android:showSilent="true" />

```

2. 创建音乐播放器的设置页面

我们可以利用Preference页面方便地创建一个音乐播放器的设置页面,包含自动播放、随机播放等多个设置项。示例代码如下:

```java

public class MusicSettingsActivity extends PreferenceActivity {

private CheckBoxPreference mAutoPlayPref;

private CheckBoxPreference mShufflePref;

private ListPreference mRepeatPref;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.music_settings);

mAutoPlayPref = (CheckBoxPreference) findPreference("autoplay_pref");

mShufflePref = (CheckBoxPreference) findPreference("shuffle_pref");

mRepeatPref = (ListPreference) findPreference("repeat_pref");

mRepeatPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

@Override

public boolean onPreferenceChange(Preference preference, Object newValue) {

int index = mRepeatPref.findIndexOfValue((String) newValue);

String[] entries = mRepeatPref.getEntries();

mRepeatPref.setSummary(entries[index]);

return true;

}

});

}

}

```

对应的布局文件music_settings.xml:

```xml

android:key="autoplay_pref"

android:title="@string/music_auto_play"

android:summary="@string/music_auto_play_hint" >

android:key="shuffle_pref"

android:title="@string/music_shuffle"

android:summary="@string/music_shuffle_hint" >

android:key="repeat_pref"

android:title="@string/music_repeat"

android:summary="@string/music_repeat_hint"

android:entries="@array/music_repeat_entries"

android:entryValues="@array/music_repeat_values"

android:defaultValue="@string/music_repeat_none">

android:title="@string/music_audio_effects"

android:summary="@string/music_audio_effects_hint" >

```

五、总结

PreferenceActivity是Android系统提供的一个方便快捷地实现设置页面的方式,可以轻松地创建各种设置项,支持多种设置项类型、布局和样式。在本文中,我们详细介绍了PreferenceActivity的使用方法,并提供了案例说明,希望能对大家有所帮助。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(64) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部