zoukankan      html  css  js  c++  java
  • Android实战技巧之六:PreferenceActivity使用详解

    一、写作前面

    当我们做应用的时候,需要用户配置一些信息,而这就是通常所说的应用设置。

    对于Android系统来说,系统本身的设置带来的用户体验和习惯已经深入人心,在我们的应用中同样用到类似的设置页,

    那么用户使用起来就会更加亲切和方便。是吗?那我们应该怎么做到呢?这就要靠本文的主人公PreferenceActivity了。

    二、设置的细节

    打开android手机的设置,如下图:

    我们会看到整个页面被分为几组:无线网络、设备、个人、账户和系统。这个分组(或者叫分类)就是PreferenceCategory。

    Wifi右边有开关,这一项就是CheckBoxPreference;其他还有ListPreference和EditTextPreference。

    你的每一次设置,都会被Preference存下来,这就是setting的数据持久化。

    三、如何实现自己的设置

    下面我们来实现一个设置程序,看看PreferenceActivity的基本知识都有哪些。

    首先要说的是,PreferenceActivity从API level1中就加入了,那么后续自Android3.0后有了Fragment的概念,同时也带来了PreferenceFragment,这是后话,今天我们先讲讲简单的。

    这个例子有两个Activity组成,第一个是MainAcitivity,程序启动后直接到此,用来现实Setting中的各项设置内容;第二个是Setting,继承自PreferenceActivity,展示如何设置和数据存储操作等。我只是想演示PreferenceActivity相关的知识,UI是直接托的,layout中也用了Hardcode,请看官只是取其精华(如果有的话),去其糟粕。

    1.Setting

    先来说说重头戏PreferenceActivity,它并不像普通的Activity那样用layout来做自己的界面,它是用专属的xml/preference.xml来构建自己的界面,然后在类中加入此xml。

    本例演示三种常用preference,如下代码:

    preferenc.xml

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >  
    3.     <PreferenceCategory android:title="First Category">  
    4.         <ListPreference  
    5.             android:key="list_key"  
    6.             android:defaultValue="list key default value"  
    7.             android:title="list title"  
    8.             android:summary="list_summary"  
    9.             android:entries="@array/list_preference"  
    10.             android:entryValues="@array/list_preference"  
    11.             android:dialogTitle="list_dialog_title" />       
    12.     </PreferenceCategory>  
    13.     <PreferenceCategory android:title="Second Category">  
    14.         <EditTextPreference  
    15.             android:key="edittext_key"  
    16.             android:defaultValue="edit default value"  
    17.             android:summary="edit summary"  
    18.             android:title="edit title" />  
    19.         <CheckBoxPreference  
    20.             android:key="checkbox_key"  
    21.             android:defaultValue="checkbox default value"  
    22.             android:summary="checkbox summary"  
    23.             android:title="checkbox title"  
    24.             />                
    25.         <EditTextPreference  
    26.             android:key="num_key"  
    27.             android:defaultValue="0"  
    28.             android:summary="edit summary"  
    29.             android:numeric="integer"  
    30.             android:title="input number" />  
    31.  </PreferenceCategory></PreferenceScreen>  

    我将这三项preference分成两组(PreferenceCategory),First Category和Second Category.


    每一个Preference中的都会包含一个key(android:key),它的功能相当于普通layout中的id。
    title:这一项的标题,字体比较大。

    summary:摘要,标题下面的文字,字体较小。
    defaultValue:为设置summary之前的默认值。

    其中数组list_preference在array.xml中定义:

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <resources>  
    3.     <string-array name="list_preference">  
    4.         <item>Red</item>  
    5.         <item>Blue</item>  
    6.         <item>Green</item>    
    7.     </string-array>  
    8. </resources>  

    Setting中是怎样加入这些UI信息呢?

    1. public class Setting extends PreferenceActivity implements OnSharedPreferenceChangeListener {  
    2.       
    3.     private EditTextPreference mEtPreference;  
    4.     private ListPreference mListPreference;  
    5.     private CheckBoxPreference mCheckPreference;  
    6.       
    7.     @Override  
    8.     protected void onCreate(Bundle savedInstanceState) {  
    9.         super.onCreate(savedInstanceState);  
    10.   
    11.         addPreferencesFromResource(R.xml.preferences);  
    12.         initPreferences();  
    13.     }  
    14.       
    15.     private void initPreferences() {  
    16.         mEtPreference = (EditTextPreference)findPreference(Consts.EDIT_KEY);  
    17.         mListPreference = (ListPreference)findPreference(Consts.LIST_KEY);  
    18.         mCheckPreference = (CheckBoxPreference)findPreference(Consts.CHECKOUT_KEY);  
    19.     }  

    此时,这个setting类就可以运行起来了。其实就是这么简单。也许你会问,我们设置了自己的偏好值,程序中如何获得呢?


    我们需要注册一个Preference变化的Listener来监听这些事件。当我们做好设置后,Preference已经替我们做好了数据持久化了。
    我们可以用sharedPreference来获得这些值。
    下面来看:

    1.    @Override  
    2.    protected void onResume() {  
    3.        super.onResume();  
    4.   
    5.        // Setup the initial values  
    6.        SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();  
    7.        mListPreference.setSummary(sharedPreferences.getString(Consts.LIST_KEY, ""));  
    8.        mEtPreference.setSummary(sharedPreferences.getString(Consts.EDIT_KEY, "linc"));  
    9.          
    10.        // Set up a listener whenever a key changes  
    11.        sharedPreferences.registerOnSharedPreferenceChangeListener(this);  
    12.    }  
    13.   
    14.    @Override  
    15.    protected void onPause() {  
    16.        super.onPause();  
    17.        // Unregister the listener whenever a key changes  
    18.        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);  
    19.    }      
    20.      
    21. @Override  
    22. public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {  
    23.        if (key.equals(Consts.EDIT_KEY)) {  
    24.         mEtPreference.setSummary(  
    25.                    sharedPreferences.getString(key, "20"));  
    26.        } else if(key.equals(Consts.LIST_KEY)) {  
    27.         mListPreference.setSummary(sharedPreferences.getString(key, ""));  
    28.        }  
    29. }  

    到此,setting的功能就实现了。那么,在其他Activity中如何获得设置的值呢?也是用sharedPreference来实现:


    看看我的MainActivity:

    1. package com.linc.howtopreferenceactivity;  
    2.   
    3. import android.os.Bundle;  
    4. import android.preference.PreferenceManager;  
    5. import android.app.Activity;  
    6. import android.content.Intent;  
    7. import android.content.SharedPreferences;  
    8. import android.view.Menu;  
    9. import android.view.View;  
    10. import android.view.View.OnClickListener;  
    11. import android.widget.Button;  
    12. import android.widget.TextView;  
    13.   
    14. public class MainActivity extends Activity {  
    15.   
    16.     private Button btnSetting,btnShow;  
    17.     private TextView tvCheckout,tvList,tvEditText;  
    18.       
    19.     @Override  
    20.     protected void onCreate(Bundle savedInstanceState) {  
    21.         super.onCreate(savedInstanceState);  
    22.         setContentView(R.layout.activity_main);  
    23.         initView();  
    24.     }  
    25.   
    26.     private void initView() {  
    27.         btnSetting = (Button)findViewById(R.id.btn_setting);  
    28.         btnShow = (Button)findViewById(R.id.btn_show);  
    29.         btnSetting.setOnClickListener(buttonListener);  
    30.         btnShow.setOnClickListener(buttonListener);  
    31.           
    32.         tvCheckout = (TextView)findViewById(R.id.tv_checkout);  
    33.         tvList = (TextView)findViewById(R.id.tv_list);  
    34.         tvEditText = (TextView)findViewById(R.id.tv_edittext);  
    35.     }  
    36.       
    37.     private OnClickListener buttonListener = new OnClickListener() {  
    38.         @Override  
    39.         public void onClick(View v) {  
    40.             switch(v.getId()) {  
    41.             case R.id.btn_setting:  
    42.                 startActivity(new Intent(MainActivity.this,Setting.class));  
    43.                 break;  
    44.             case R.id.btn_show:  
    45.                 showSettingInfo();  
    46.                 break;  
    47.             }  
    48.         }  
    49.     };  
    50.       
    51.     private void showSettingInfo() {  
    52.         SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);  
    53.         tvCheckout.setText(settings.getBoolean(Consts.CHECKOUT_KEY, false)+"");  
    54.         tvEditText.setText(settings.getString(Consts.EDIT_KEY, ""));  
    55.         tvList.setText(settings.getString(Consts.LIST_KEY, "linc"));  
    56.     }  
    57.       
    58.     @Override  
    59.     public boolean onCreateOptionsMenu(Menu menu) {  
    60.         // Inflate the menu; this adds items to the action bar if it is present.  
    61.         getMenuInflater().inflate(R.menu.main, menu);  
    62.         return true;  
    63.     }  
    64.   
    65. }  


    当然,就像用edit text一样,我们可以限制输入的是文字还是数字或者是字母。就像上面代码:android:numeric="integer"


    完整代码在此:HowToPreferenceActivity

  • 相关阅读:
    ORACLE小错误和小技巧
    linux下面ssh免密码登陆
    JAVA中值传递和引用传递,抽象类,接口的概念
    org.apache.catalina.LifecycleException tomcat 启动 maven 处处都是坑!!!
    springmvc登陆拦截案例
    eclipse tomcat add and remove工程异常
    spring 官方下载地址(Spring Framework 3.2.x&Spring Framework 4.0.x)
    SpringMvc JSON 406,吐血。。。。
    List
    集合Collection
  • 原文地址:https://www.cnblogs.com/yaowen/p/7281828.html
Copyright © 2011-2022 走看看