|
Android軟件開發(fā)之PreferenceActivity中的組件
1.PreferenceActivity 介紹
PreferenceActivity 繼承ListActivity 它是以一個(gè)列表的形式在展現(xiàn)內(nèi)容,它最主要的特點(diǎn)是添加Preference可以讓控件的狀態(tài)持久化儲(chǔ)存,舉個(gè)例子 比如用戶選中checkbox后 退出應(yīng)用然后在進(jìn)入應(yīng)用,這時(shí)用戶希望看到的是checkbox被選中,所以軟件須要記錄用戶每次操作的過程并且持久儲(chǔ)存,在進(jìn)入應(yīng)用的時(shí)候須要判斷這些久儲(chǔ)存的數(shù)據(jù)然后將系統(tǒng)控件的狀態(tài)呈現(xiàn)在UI中。
尤其是軟件開發(fā)肯定會(huì)有一堆設(shè)置選項(xiàng)選項(xiàng),每次進(jìn)入Activity都去手動(dòng)的去取儲(chǔ)存的數(shù)據(jù),這樣代碼會(huì)變得很復(fù)雜很麻煩。 這個(gè)時(shí)候Preference就出來了,它就是專門解決這些特殊的選項(xiàng)保存與讀取的顯示。用戶每次操作事件它會(huì)及時(shí)的以鍵值對(duì)的形式記錄在SharedPreferences中,Activity每次啟動(dòng)它會(huì)自動(dòng)幫我們完成數(shù)據(jù)的讀取以及UI的顯示。
Android開發(fā)中一共為我們提供了4個(gè)組件,分別是CheckBoxPreference組件、EditTextPreference組件、ListPreference組件、RingtonePreference組件,下面我用一個(gè)例子一一向同學(xué)們介紹一下。
2.CheckBoxPreference組件
CheckBoxPreference 選中為true 取消選中為false 它的值會(huì)以boolean的形式儲(chǔ)存在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="這是一個(gè)勾選框A" >
</CheckBoxPreference>
<CheckBoxPreference android:key="checkbox_1"
android:title="CheckBox_B"
android:summary="這是一個(gè)勾選框B" >
</CheckBoxPreference>
</PreferenceCategory>
</PreferenceScreen>
復(fù)制代碼 - 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 ,選擇的值將會(huì)自動(dòng)保存到SharePreferences
addPreferencesFromResource(R.xml.checkbox);
mContext = this;
//CheckBoxPreference組件
CheckBoxPreference mCheckbox0 = (CheckBoxPreference) findPreference("checkbox_0");
mCheckbox0.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
//這里可以監(jiān)聽到這個(gè)CheckBox 的點(diǎn)擊事件
return true;
}
});
mCheckbox0.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference arg0, Object newValue) {
//這里可以監(jiān)聽到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) {
//這里可以監(jiān)聽到這個(gè)CheckBox 的點(diǎn)擊事件
return true;
}
});
mCheckbox1.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference arg0, Object newValue) {
//這里可以監(jiān)聽到checkBox中值是否改變了
//并且可以拿到新改變的值
Toast.makeText(mContext, "checkBox_1改變的值為" + (Boolean)newValue, Toast.LENGTH_LONG).show();
return true;
}
});
}
}
復(fù)制代碼 3.EditTextPreference組件
EditTextPreference 點(diǎn)擊后會(huì)彈出一個(gè)輸入框,輸入的內(nèi)容會(huì)以字符串的的形式儲(chǔ)存在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="請(qǐng)輸入您的信息"
android:defaultValue="請(qǐng)輸入信息"
android:dialogTitle="輸入框">
</EditTextPreference>
<EditTextPreference android:key="edit_1"
android:title="輸入信息_B"
android:summary="請(qǐng)輸入您的信息"
android:defaultValue="請(qǐng)輸入信息"
android:dialogTitle="輸入框">
</EditTextPreference>
</PreferenceCategory>
</PreferenceScreen>
復(fù)制代碼
- 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 ,選擇的值將會(huì)自動(dòng)保存到SharePreferences
addPreferencesFromResource(R.xml.edittext);
mContext = this;
// EditTextPreference組件
EditTextPreference mEditText = (EditTextPreference) findPreference("edit_0");
//設(shè)置dialog按鈕信息
mEditText.setPositiveButtonText("確定");
mEditText.setNegativeButtonText("取消");
//設(shè)置按鈕圖標(biāo)
mEditText.setDialogIcon(R.drawable.jay);
}
}
復(fù)制代碼 4.ListPreference組件
在res/array中先寫兩個(gè)數(shù)組,一個(gè)用與list的顯示內(nèi)容,一個(gè)用戶list的選中數(shù)值。 - <?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>
復(fù)制代碼 ListPreference點(diǎn)擊后會(huì)彈出一個(gè)列表框,選中后會(huì)將選中的內(nèi)容(上面數(shù)組中的值)會(huì)以字符串的的形式儲(chǔ)存在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="登錄設(shè)置A"
android:dialogTitle="選擇在線時(shí)間"
android:entries="@array/auto_logout_time_key"
android:entryValues="@array/auto_logout_time_value" >
</ListPreference>
<ListPreference
android:key="list_0"
android:title="登錄設(shè)置A"
android:dialogTitle="選擇在線時(shí)間"
android:entries="@array/auto_logout_time_key"
android:entryValues="@array/auto_logout_time_value" >
</ListPreference>
</PreferenceCategory>
</PreferenceScreen>
復(fù)制代碼 - import android.os.Bundle;
import android.preference.PreferenceActivity;
public class ListActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 從資源文件中添Preferences ,選擇的值將會(huì)自動(dòng)保存到SharePreferences
addPreferencesFromResource(R.xml.list);
}
}
復(fù)制代碼 5.RingtonePreference組件
RingtonePreference點(diǎn)擊后會(huì)彈出一個(gè)系統(tǒng)鈴聲的列表框,選中后會(huì)將選中的內(nèi)容(uri字符集)會(huì)以字符串的的形式儲(chǔ)存在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="選擇系統(tǒng)鈴聲A"
android:title="鈴聲設(shè)置"
android:ringtoneType="all"
android:showSilent="true" ></RingtonePreference>
<RingtonePreference
android:key="ringtone_!"
android:summary="選擇系統(tǒng)鈴聲B"
android:title="鈴聲設(shè)置"
android:ringtoneType="all"
android:showSilent="true" ></RingtonePreference>
</PreferenceCategory>
</PreferenceScreen>
復(fù)制代碼 android:ringtoneType 系統(tǒng)一共提供了4中響鈴模式的類型分別為 鈴聲(ringtone) 通知( notification) 警告(alarm) 全部(all)
模擬器默認(rèn)是沒有鈴聲的,下圖中的鈴聲我是將歌曲文件拷貝到SD卡中,設(shè)置鈴聲后才會(huì)出現(xiàn)的。如果覺得拷貝麻煩可以使用豌豆莢或者91助手將歌曲文件放入手機(jī)SD卡中,在鈴聲設(shè)置那里設(shè)置一下在這里就會(huì)出現(xiàn)。
- import android.os.Bundle;
import android.preference.PreferenceActivity;
public class RingtoneActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 從資源文件中添Preferences ,選擇的值將會(huì)自動(dòng)保存到SharePreferences
addPreferencesFromResource(R.xml.ringtone);
}
}
復(fù)制代碼 5.自定義控件
使用系統(tǒng)的控件在顯示方面難免會(huì)有些單一,如果想做一個(gè)好看的界面就需要使用自定義Preference。下面我簡(jiǎn)單說明一下如何編寫自定義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>
復(fù)制代碼 android:background="@drawable/preference_mid_background"
通過這一行可以設(shè)置這個(gè)按鈕的點(diǎn)擊、選中默認(rèn)的顯示狀態(tài),這樣可以讓你的按鈕更加好看。須要在res/drawable中添加xml文件
android:state_facused :為控件選中顯示
android:state_pressed:為控件按下顯示
最后一個(gè)為默認(rèn)顯示 - <?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>
復(fù)制代碼 - 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 ,選擇的值將會(huì)自動(dòng)保存到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;
}
});
}
}
復(fù)制代碼 讀取數(shù)據(jù)
在PreferenceActivity中可以用下面這種方式拿到SharedPreferences中儲(chǔ)存的數(shù)值,通過PreferenceManager.getDefaultSharedPreferences(this) 方法拿到控件默認(rèn)儲(chǔ)存的sharedPreferences對(duì)象。 - SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
boolean something = prefs.getBoolean("something",false);
復(fù)制代碼 在模擬起中將SharedPreferences儲(chǔ)存內(nèi)容拷貝出來后,可以清楚的看到通過點(diǎn)擊系統(tǒng)控件儲(chǔ)存的數(shù)值。這里我說一下鈴聲的儲(chǔ)存,它是以一個(gè)字符串形式的uri字符集,它所指向的是系統(tǒng)鈴聲儲(chǔ)存的路徑。所以根據(jù)這個(gè)字符集就可以找到這個(gè)鈴聲。 復(fù)制代碼 第二十八講 Preference.rar(307.78 KB, 下載次數(shù): 273)[/I]2011-9-3 01:12 上傳點(diǎn)擊文件名 下載積分: 下載豆 -2 |
上一篇: android條形碼掃描(留著自己學(xué)習(xí))下一篇: Android中Surface和SurfaceView的一些理解和總結(jié)
|