偏好学习
开发移动应用程序时,通常会出现以下需求:存储用户的首选项,并在应用程序启动时使用它们。 由于这是经常性的需求,因此Google为我们创建了偏好设置框架。 提供的机制使我们可以非常轻松地显示,保存和操纵用户的偏好。 此外,该框架还支持自动UI创建。 我的意思是,通过声明用户首选项的类型,可以自动生成用于操纵这些首选项的用户界面,而无需编写单个行代码。 对于快速的应用程序开发,这听起来如何?
为了利用首选项框架,第一步是扩展PreferenceActivity类。 这只是从ListActivity派生的便利类,并允许从XML文件引导首选项UI。 此外,它会自动保存到幕后的SharedPreferences中。 不要忘记, SharedPreferences是负责访问和修改首选项数据的接口,我们可以通过调用Activity的getSharedPreferences方法来手动操作它。 为了将我们的PreferenceActivity类和XML布局文件联系在一起,我们使用addPreferencesFromResource方法。 因此,我们的onCreate方法非常简单,如下所示:
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
...
假设我们已经在“ res / xml”文件夹中创建了一个名为“ preferences.xml”的文件。 然后,在运行时,活动将膨胀给定的XML资源,并将首选项层次结构添加到当前的首选项层次结构中。 该XML文件具有特定的格式,通过该格式我们可以定义首选项的类型。 所有类型都派生自Preference类, Preference类代表基本的首选项UI构建块,并提供要在活动中显示的View以及与SharedPreferences对象的关联以存储/检索首选项数据。 以下是一些可以直接使用的最常见子类:
- CheckBoxPreference :提供复选框小部件功能。 将存储一个布尔值。
- RingtonePreference :允许用户从设备上的铃声中选择铃声。 所选铃声的URI将作为字符串保留。
- EditTextPreference :允许输入字符串。 将一个字符串存储到SharedPreferences中。
- ListPreference :将条目列表显示为对话框。 此首选项会将一个字符串存储到SharedPreferences中。
还请记住,可以使用PreferenceCategory类将各种首选项分组为类别,该类将Preference对象分组并在该组上方提供禁用的标题。
让我们检查一下XML声明文件将由什么组成。 我们将分为两类。 在第一个下,我们将具有CheckBoxPreference和ListPreference , CheckBoxPreference将启用或禁用对假设应用程序的数据更新,通过ListPreference我们将定义我们希望更新发生的频率。 您可能已经猜到了,这两个首选项之间存在依赖关系。 这可以通过使用android:dependency属性来实现。 最后,在第二个类别下,我们将有一个EditTextPreference,通过该文本将保存欢迎消息并在必要时显示。 XML文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="First Category"
android:key="first_category">
<CheckBoxPreference
android:key="perform_updates"
android:summary="Enable or disable data updates"
android:title="Enable updates"
android:defaultValue="true"
/>
<ListPreference
android:key="updates_interval"
android:title="Updates interval"
android:summary="Define how often updates will be performed"
android:defaultValue="1000"
android:entries="@array/updateInterval"
android:entryValues="@array/updateIntervalValues"
android:dependency="perform_updates"
/>
</PreferenceCategory>
<PreferenceCategory
android:title="Second Category"
android:key="second_category">
<EditTextPreference
android:key="welcome_message"
android:title="Welcome Message"
android:summary="Define the Welcome message to be shown"
android:dialogTitle="Welcome Message"
android:dialogMessage="Provide a message"
android:defaultValue="Default welcome message" />
</PreferenceCategory>
</PreferenceScreen>
请注意,对于ListPreference ,定义了android:entries属性。 我们使用它来加载预定义值,这些预定义值保存在外部XML文件中,名称为“ res / values / arrays.xml”。 从该文件中使用“ updateInterval”和“ updateIntervalValue”条目。 这些实际上是键值对,因此存储的实际值是第二个列表中的一个。 该文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="updateInterval">
<item name="1000">Every 1 second</item>
<item name="5000">Every 5 seconds</item>
<item name="30000">Every 30 seconds</item>
<item name="60000">Every 1 minute</item>
<item name="300000">Every 5 minutes</item>
</string-array>
<string-array name="updateIntervalValues">
<item name="1000">1000</item>
<item name="5000">5000</item>
<item name="30000">30000</item>
<item name="60000">60000</item>
<item name="300000">300000</item>
</string-array>
</resources>
正如我们所解释的,方程的持久部分由框架处理。 为了向您展示如何读取已经存在的值,我们将创建另一个活动,该活动将从我们的主要活动中启动。 首先让我们看一下主要活动的样子:
package com.javacodegeeks.android.preferences;
import android.content.Intent;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.view.Menu;
import android.view.MenuItem;
public class QuickPrefsActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(Menu.NONE, 0, 0, "Show current settings");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
startActivity(new Intent(this, ShowSettingsActivity.class));
return true;
}
return false;
}
}
这里没什么特别的。 我们仅使用onCreateOptionsMenu方法提供一个只有一个MenuItem的选项菜单。 当用户选择特定项目时,我们将在onOptionsItemSelected方法内处理其动作,并使用startActivity方法启动一个新活动。 如果您想了解更多有关选项菜单的信息,请查看我的旧教程“使用选项菜单和自定义对话框进行用户交互”。 有关启动活动的更多信息,请参见我的教程“使用意图启动新活动”。
现在让我们创建“ ShowSettingsActivity”。 首先,我们必须在Android清单文件中对其进行声明,因此此处的“ AndroidManifest.xml”文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.javacodegeeks.android.preferences"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".QuickPrefsActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ShowSettingsActivity" />
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
这是活动本身的代码:
package com.javacodegeeks.android.preferences;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.widget.TextView;
public class ShowSettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.show_settings_layout);
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
StringBuilder builder = new StringBuilder();
builder.append("\n" + sharedPrefs.getBoolean("perform_updates", false));
builder.append("\n" + sharedPrefs.getString("updates_interval", "-1"));
builder.append("\n" + sharedPrefs.getString("welcome_message", "NULL"));
TextView settingsTextView = (TextView) findViewById(R.id.settings_text_view);
settingsTextView.setText(builder.toString());
}
}
在活动内部,我们通过使用PreferenceManager类的静态方法getDefaultSharedPreferences来引用SharedPreferences类。 然后,根据首选项的数据类型,我们使用适当的getter方法,例如getBoolean或getString 。 请注意,这些参数的第二个参数是默认值,如果尚未存储aa值,则将使用该默认值。 我们将原始“ preferences.xml”文件中定义的那些密钥(例如“ perform_updates”,“ updates_interval”和“ welcome_message”)用作密钥。 将这些值连接起来,然后在TextView中显示。
这也是特定活动的简单布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/settings_text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
如果现在启动Eclipse配置,我们将获得如下所示的首选项屏幕:
单击“更新间隔”将导致出现以下选项列表:
同样,单击“欢迎消息”首选项将导致显示编辑文本:
现在,让我们阅读已经存在的值。 点击模拟器上的“菜单”按钮,以显示选项菜单,然后选择“显示当前设置”项。 这将启动我们的第二个活动,在其中读取值并显示如下:
就是这样。 关于如何利用SDK中提供的首选项框架的快速指南,以快速操纵应用程序中的用户首选项。 您可以在此处找到本教程中创建的Eclipse项目。
干杯!
- “ Android完整应用程序教程”系列
- 使用XML Pull增强Android XML解析
- Android文字转语音应用
- 带有Yahoo API的Android反向地理编码– PlaceFinder
- Android基于位置的服务应用程序– GPS位置
- 使用VirtualBox在PC上安装Android OS
翻译自: https://www.javacodegeeks.com/2011/01/android-quick-preferences-tutorial.html
偏好学习