偏好学习_Android快速偏好设定教学课程

偏好学习

偏好学习

开发移动应用程序时,通常会出现以下需求:存储用户的首选项,并在应用程序启动时使用它们。 由于这是经常性的需求,因此Google为我们创建了偏好设置框架。 提供的机制使我们可以非常轻松地显示,保存和操纵用户的偏好。 此外,该框架还支持自动UI创建。 我的意思是,通过声明用户首选项的类型,可以自动生成用于操纵这些首选项的用户界面,而无需编写单个行代码。 对于快速的应用程序开发,这听起来如何?

为了利用首选项框架,第一步是扩展PreferenceActivity类。 这只是从ListActivity派生的便利类,并允许从XML文件引导首选项UI。 此外,它会自动保存到幕后的SharedPreferences中。 不要忘记, SharedPreferences是负责访问和修改首选项数据的接口,我们可以通过调用ActivitygetSharedPreferences方法来手动操作它。 为了将我们的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对象的关联以存储/检索首选项数据。 以下是一些可以直接使用的最常见子类:

还请记住,可以使用PreferenceCategory类将各种首选项分组为类别,该类将Preference对象分组并在该组上方提供禁用的标题。

让我们检查一下XML声明文件将由什么组成。 我们将分为两类。 在第一个下,我们将具有CheckBoxPreferenceListPreferenceCheckBoxPreference将启用或禁用对假设应用程序的数据更新,通过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方法,例如getBooleangetString 。 请注意,这些参数的第二个参数是默认值,如果尚未存储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项目。

干杯!

相关文章 :
相关片段:

翻译自: https://www.javacodegeeks.com/2011/01/android-quick-preferences-tutorial.html

偏好学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值