|
Android軟件開發(fā)之PreferenceActivity中的組件
1.PreferenceActivity 介紹
PreferenceActivity 繼承ListActivity 它是以一個列表的形式在展現(xiàn)內(nèi)容,它最主要的特點是添加Preference可以讓控件的狀態(tài)持久化儲存,舉個例子 比如用戶選中checkbox后 退出應(yīng)用然后在進入應(yīng)用,這時用戶希望看到的是checkbox被選中,所以軟件須要記錄用戶每次操作的過程并且持久儲存,在進入應(yīng)用的時候須要判斷這些久儲存的數(shù)據(jù)然后將系統(tǒng)控件的狀態(tài)呈現(xiàn)在UI中。
尤其是軟件開發(fā)肯定會有一堆設(shè)置選項選項,每次進入Activity都去手動的去取儲存的數(shù)據(jù),這樣代碼會變得很復(fù)雜很麻煩。 這個時候Preference就出來了,它就是專門解決這些特殊的選項保存與讀取的顯示。用戶每次操作事件它會及時的以鍵值對的形式記錄在SharedPreferences中,Activity每次啟動它會自動幫我們完成數(shù)據(jù)的讀取以及UI的顯示。
Android開發(fā)中一共為我們提供了4個組件,分別是CheckBoxPreference組件、EditTextPreference組件、ListPreference組件、RingtonePreference組件,下面我用一個例子一一向同學(xué)們介紹一下。
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>
復(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 ,選擇的值將會自動保存到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)聽到這個CheckBox 的點擊事件
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)聽到這個CheckBox 的點擊事件
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 點擊后會彈出一個輸入框,輸入的內(nèi)容會以字符串的的形式儲存在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>
復(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 ,選擇的值將會自動保存到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中先寫兩個數(shù)組,一個用與list的顯示內(nèi)容,一個用戶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點擊后會彈出一個列表框,選中后會將選中的內(nèi)容(上面數(shù)組中的值)會以字符串的的形式儲存在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="選擇在線時間"
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="選擇在線時間"
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 ,選擇的值將會自動保存到SharePreferences
addPreferencesFromResource(R.xml.list);
}
}
復(fù)制代碼 5.RingtonePreference組件
RingtonePreference點擊后會彈出一個系統(tǒng)鈴聲的列表框,選中后會將選中的內(nèi)容(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="選擇系統(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)
模擬器默認是沒有鈴聲的,下圖中的鈴聲我是將歌曲文件拷貝到SD卡中,設(shè)置鈴聲后才會出現(xiàn)的。如果覺得拷貝麻煩可以使用豌豆莢或者91助手將歌曲文件放入手機SD卡中,在鈴聲設(shè)置那里設(shè)置一下在這里就會出現(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 ,選擇的值將會自動保存到SharePreferences
addPreferencesFromResource(R.xml.ringtone);
}
}
復(fù)制代碼 5.自定義控件
使用系統(tǒng)的控件在顯示方面難免會有些單一,如果想做一個好看的界面就需要使用自定義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>
復(fù)制代碼 android:background="@drawable/preference_mid_background"
通過這一行可以設(shè)置這個按鈕的點擊、選中默認的顯示狀態(tài),這樣可以讓你的按鈕更加好看。須要在res/drawable中添加xml文件
android:state_facused :為控件選中顯示
android:state_pressed:為控件按下顯示
最后一個為默認顯示 ps3"> - <?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 ,選擇的值將會自動保存到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中儲存的數(shù)值,通過PreferenceManager.getDefaultSharedPreferences(this) 方法拿到控件默認儲存的sharedPreferences對象。 - SharedPreferences prefs =PreferenceManager.getDefaultSharedPreferences(this) ;
boolean something = prefs.getBoolean("something",false);
復(fù)制代碼 在模擬起中將SharedPreferences儲存內(nèi)容拷貝出來后,可以清楚的看到通過點擊系統(tǒng)控件儲存的數(shù)值。這里我說一下鈴聲的儲存,它是以一個字符串形式的uri字符集,它所指向的是系統(tǒng)鈴聲儲存的路徑。所以根據(jù)這個字符集就可以找到這個鈴聲。 - <?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>
復(fù)制代碼 第二十八講 Preference.rar(307.78 KB, 下載次數(shù): 273)[/I]2011-9-3 01:12 上傳點擊文件名 下載積分: 下載豆 -2 |
上一篇: android條形碼掃描(留著自己學(xué)習(xí))下一篇: Android中Surface和SurfaceView的一些理解和總結(jié)
|