Android软件开发之PreferenceActivity中的组件

 

1.PreferenceActivity 介绍

PreferenceActivity 继承ListActivity 它是以一个列表的形式在展现内容,它最主要的特点是添加Preference可以让控件的状态持久化储存,举个例子 比如用户选中checkbox后 退出应用然后在进入应用,这时用户希望看到的是checkbox被选中,所以软件须要记录用户每次操作的过程并且持久储存,在进入应用的时候须要判断这些久储存的数据然后将系统控件的状态呈现在UI中。


尤其是软件开发肯定会有一堆设置选项选项,每次进入Activity都去手动的去取储存的数据,这样代码会变得很复杂很麻烦。 这个时候Preference就出来了,它就是专门解决这些特殊的选项保存与读取的显示。用户每次操作事件它会及时的以键值对的形式记录在SharedPreferences中,Activity每次启动它会自动帮我们完成数据的读取以及UI的显示。

Android开发中一共为我们提供了4个组件,分别是CheckBoxPreference组件、EditTextPreference组件、ListPreference组件、RingtonePreference组件,下面我用一个例子一一向同学们介绍一下。

2.CheckBoxPreference组件

CheckBoxPreference 选中为true 取消选中为false 它的值会以boolean的形式储存在SharedPreferences中。

<?xml version="1.0" encoding="utf-8"?>  
<PreferenceScreen  
  xmlns:Android="http://schemas.android.com/apk/res/android">  
    <PreferenceCategory android:title="CheckBoxPreference">     
    <CheckBoxPreference android:key="checkbox_0"  
        android:title="CheckBox_A"  
        android:summary="这是一个勾选框A" >  
    </CheckBoxPreference>  
      
    <CheckBoxPreference android:key="checkbox_1"  
        android:title="CheckBox_B"  
        android:summary="这是一个勾选框B" >  
    </CheckBoxPreference>  
    </PreferenceCategory>  
</PreferenceScreen> 


import Android.content.Context;  
import android.os.Bundle;  
import android.preference.CheckBoxPreference;  
import android.preference.Preference;  
import android.preference.PreferenceActivity;  
import android.preference.Preference.OnPreferenceChangeListener;  
import android.preference.Preference.OnPreferenceClickListener;  
import android.widget.Toast;  
  
public class CheckBoxActivity extends PreferenceActivity {  
  
    Context mContext = null;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    // 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences   
    addPreferencesFromResource(R.xml.checkbox);  
      
    mContext = this;  
      
    //CheckBoxPreference组件   
    CheckBoxPreference mCheckbox0 = (CheckBoxPreference) findPreference("checkbox_0");  
    mCheckbox0.setOnPreferenceClickListener(new OnPreferenceClickListener() {  
          
        @Override  
        public boolean onPreferenceClick(Preference preference) {  
        //这里可以监听到这个CheckBox 的点击事件   
        return true;  
        }  
    });  
      
    mCheckbox0.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {  
          
        @Override  
        public boolean onPreferenceChange(Preference arg0, Object newValue) {  
        //这里可以监听到checkBox中值是否改变了   
        //并且可以拿到新改变的值   
          Toast.makeText(mContext, "checkBox_0改变的值为" +  (Boolean)newValue, Toast.LENGTH_LONG).show();    
        return true;  
        }  
    });  
  
    CheckBoxPreference mCheckbox1 = (CheckBoxPreference) findPreference("checkbox_1");  
    mCheckbox1.setOnPreferenceClickListener(new OnPreferenceClickListener() {  
          
        @Override  
        public boolean onPreferenceClick(Preference preference) {  
        //这里可以监听到这个CheckBox 的点击事件   
        return true;  
        }  
    });  
      
    mCheckbox1.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {  
          
        @Override  
        public boolean onPreferenceChange(Preference arg0, Object newValue) {  
        //这里可以监听到checkBox中值是否改变了   
        //并且可以拿到新改变的值   
          Toast.makeText(mContext, "checkBox_1改变的值为" +  (Boolean)newValue, Toast.LENGTH_LONG).show();    
        return true;  
        }  
    });  
      
    }  
  

3.EditTextPreference组件

EditTextPreference 点击后会弹出一个输入框,输入的内容会以字符串的的形式储存在SharedPreferences中。

<?xml version="1.0" encoding="utf-8"?>  
<PreferenceScreen  
  xmlns:Android="http://schemas.android.com/apk/res/android">  
    <PreferenceCategory Android:title="EditTextPreference">     
    <EditTextPreference Android:key="edit_0"  
        Android:title="输入信息_A"  
        Android:summary="请输入您的信息"  
        Android:defaultValue="请输入信息"  
        Android:dialogTitle="输入框">  
    </EditTextPreference>  
          
     <EditTextPreference Android:key="edit_1"  
        Android:title="输入信息_B"  
        Android:summary="请输入您的信息"  
        Android:defaultValue="请输入信息"  
        Android:dialogTitle="输入框">  
    </EditTextPreference>  
    </PreferenceCategory>  
</PreferenceScreen> 


import Android.content.Context;  
import Android.os.Bundle;  
import Android.preference.EditTextPreference;  
import Android.preference.PreferenceActivity;  
  
public class EditTextActivity extends PreferenceActivity {  
  
    Context mContext = null;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    // 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences   
    addPreferencesFromResource(R.xml.edittext);  
  
    mContext = this;  
  
    // EditTextPreference组件   
    EditTextPreference mEditText = (EditTextPreference) findPreference("edit_0");  
      
    //设置dialog按钮信息   
    mEditText.setPositiveButtonText("确定");  
    mEditText.setNegativeButtonText("取消");  
      
    //设置按钮图标   
    mEditText.setDialogIcon(R.drawable.jay);  
    }  
  
    

4.ListPreference组件

在res/array中先写两个数组,一个用与list的显示内容,一个用户list的选中数值。

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
  
<string-array name="auto_logout_time_key">  
        <item>10 mins.</item>  
        <item>20 mins.</item>  
        <item>30 mins.</item>  
        <item>60 mins.</item>  
</string-array>  
  
<string-array name="auto_logout_time_value">  
        <item>600000</item>  
        <item>1200000</item>  
        <item>1800000</item>  
        <item>3600000</item>  
</string-array>  
</resources> 
ListPreference点击后会弹出一个列表框,选中后会将选中的内容(上面数组中的值)会以字符串的的形式储存在SharedPreferences中。

<?xml version="1.0" encoding="utf-8"?>  
<PreferenceScreen  
  xmlns:Android="http://schemas.android.com/apk/res/android">  
  <PreferenceCategory Android:title="ListPreference">   
        <ListPreference   
            Android:key="list_0"  
            Android:title="登录设置A"   
            Android:dialogTitle="选择在线时间"  
            Android:entries="@array/auto_logout_time_key"  
            Android:entryValues="@array/auto_logout_time_value" >  
        </ListPreference>  
      
        <ListPreference   
            Android:key="list_0"  
            Android:title="登录设置A"   
            Android:dialogTitle="选择在线时间"  
            Android:entries="@array/auto_logout_time_key"  
            Android:entryValues="@array/auto_logout_time_value" >  
        </ListPreference>  
    </PreferenceCategory>  
</PreferenceScreen> 


import Android.os.Bundle;  
import Android.preference.PreferenceActivity;  
  
public class ListActivity extends PreferenceActivity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    // 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences   
    addPreferencesFromResource(R.xml.list);  
    }  

5.RingtonePreference组件

RingtonePreference点击后会弹出一个系统铃声的列表框,选中后会将选中的内容(uri字符集)会以字符串的的形式储存在SharedPreferences中。

<?xml version="1.0" encoding="utf-8"?>  
<PreferenceScreen  
  xmlns:Android="http://schemas.android.com/apk/res/android">  
 <PreferenceCategory Android:title="RingtonePreference">    
     <RingtonePreference    
         Android:key="ringtone_0"    
         Android:summary="选择系统铃声A"    
         Android:title="铃声设置"    
         Android:ringtoneType="all"    
         Android:showSilent="true" ></RingtonePreference>  
      
    <RingtonePreference    
        Android:key="ringtone_!"    
        Android:summary="选择系统铃声B"    
        Android:title="铃声设置"    
        Android:ringtoneType="all"    
        Android:showSilent="true" ></RingtonePreference>  
      
    </PreferenceCategory>  
</PreferenceScreen> 
Android:ringtoneType 系统一共提供了4中响铃模式的类型分别为  铃声(ringtone)  通知( notification) 警告(alarm) 全部(all)

模拟器默认是没有铃声的,下图中的铃声我是将歌曲文件拷贝到SD卡中,设置铃声后才会出现的。如果觉得拷贝麻烦可以使用豌豆荚或者91助手将歌曲文件放入手机SD卡中,在铃声设置那里设置一下在这里就会出现。

 

import Android.os.Bundle;  
import Android.preference.PreferenceActivity;  
  
public class RingtoneActivity extends PreferenceActivity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    // 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences   
    addPreferencesFromResource(R.xml.ringtone);  
    }  

6.自定义控件

使用系统的控件在显示方面难免会有些单一,如果想做一个好看的界面就需要使用自定义Preference。下面我简单说明一下如何编写自定义Preference。首先在res/layout中添加preferences文件

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout    xmlns:Android="http://schemas.android.com/apk/res/android"  
    Android:layout_width="fill_parent"  
    Android:layout_height="fill_parent"  
    Android:background="#00000000">  
    <LinearLayout  
        Android:gravity="center_vertical"  
        Android:background="@drawable/preference_mid_background"  
  
        Android:layout_width="fill_parent"  
        Android:layout_height="wrap_content"  
        >  
        <ImageView  
            Android:focusable="false"  
            Android:layout_width="wrap_content"  
            Android:layout_height="wrap_content" android:src="@drawable/setting_about_us">  
        </ImageView>  
        <RelativeLayout  
            Android:layout_width="wrap_content"  
            Android:layout_height="wrap_content"  
            Android:layout_marginLeft="15dip"  
            Android:layout_marginTop="6dip"  
            Android:layout_marginRight="6dip"  
            Android:layout_marginBottom="6dip"  
            Android:layout_weight="1"  
            >  
            <TextView  
                Android:textSize="15dip"  
                Android:textColor="#000000"  
                Android:ellipsize="marquee"  
                Android:id="@+android:id/title"  
                Android:fadingEdge="horizontal"  
                Android:layout_width="wrap_content"  
                Android:layout_height="wrap_content"  
                Android:singleLine="true"  
                >  
            </TextView>  
            <TextView  
                Android:textAppearance="?android:attr/textAppearanceSmall"  
                Android:textColor="#565656"  
                Android:id="@+android:id/summary"  
                Android:layout_width="wrap_content"  
                Android:layout_height="wrap_content"  
                Android:maxLines="4"  
                Android:layout_below="@+android:id/title"  
                Android:layout_alignLeft="@+android:id/title"  
                >  
            </TextView>  
        </RelativeLayout>  
            <ImageView  
                Android:focusable="false"  
                Android:layout_width="wrap_content"  
                Android:layout_height="wrap_content"   
                Android:background="@drawable/preference_arrows"/>  
    </LinearLayout>  
</LinearLayout> 
Android:background="@drawable/preference_mid_background"
通过这一行可以设置这个按钮的点击、选中默认的显示状态,这样可以让你的按钮更加好看。须要在res/drawable中添加xml文件

Android:state_facused :为控件选中显示
Android:state_pressed:为控件按下显示
最后一个为默认显示

<?xml version="1.0" encoding="utf-8"?>  
<selector  
    xmlns:Android="http://schemas.android.com/apk/res/android">  
    <item  
        Android:state_focused="true"  
        Android:drawable="@drawable/preference_mid_pressed"  
        >  
    </item>  
    <item  
        Android:state_pressed="true"  
        Android:drawable="@drawable/preference_mid_pressed"  
        >  
    </item>  
    <item  
  
        Android:drawable="@drawable/preference_mid"  
        >  
    </item>  
  
</selector> 


import Android.content.Context;  
import Android.os.Bundle;  
import Android.preference.Preference;  
import Android.preference.PreferenceActivity;  
import Android.preference.Preference.OnPreferenceClickListener;  
import Android.widget.Toast;  
  
public class AllActivity extends PreferenceActivity {  
     
    /**自定义布局A**/  
    Preference preference0 = null;  
      
    /**自定义布局B**/  
    Preference preference1 = null;  
      
    Context mContext = null;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    // 从资源文件中添Preferences ,选择的值将会自动保存到SharePreferences   
    addPreferencesFromResource(R.xml.all);  
    mContext = this;  
      
    preference0 = findPreference("pref_key_0");  
      
    preference0.setOnPreferenceClickListener(new OnPreferenceClickListener() {  
          
        @Override  
        public boolean onPreferenceClick(Preference preference) {  
          Toast.makeText(mContext, "自定义布局A被按下", Toast.LENGTH_LONG).show();    
        return false;  
        }  
    });  
    preference1 = findPreference("pref_key_1");  
      
    preference1.setOnPreferenceClickListener(new OnPreferenceClickListener() {  
          
        @Override  
        public boolean onPreferenceClick(Preference preference) {  
          Toast.makeText(mContext, "自定义布局B被按下", Toast.LENGTH_LONG).show();    
        return false;  
        }  
    });  
    }  

读取数据

在PreferenceActivity中可以用下面这种方式拿到SharedPreferences中储存的数值,通过PreferenceManager.getDefaultSharedPreferences(this) 方法拿到控件默认储存的sharedPreferences对象。

SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;  
   boolean something = prefs.getBoolean("something",false); 
在模拟起中将SharedPreferences储存内容拷贝出来后,可以清楚的看到通过点击系统控件储存的数值。这里我说一下铃声的储存,它是以一个字符串形式的uri字符集,它所指向的是系统铃声储存的路径。所以根据这个字符集就可以找到这个铃声。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>  
<map>  
<string name="ringtone_!">content://media/external/audio/media/1</string>  
<string name="ringtone_0">content://media/external/audio/media/1</string>  
<string name="list_0">1800000</string>  
<string name="edit_1">请输入信息1212</string>  
<string name="list">1200000</string>  
<string name="ringtone">content://settings/system/ringtone</string>  
<boolean name="checkbox_0" value="true" />  
<boolean name="checkbox_1" value="true" />  
<string name="edit_0">请输入信息</string>  
</map> 
最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习


 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值