編輯:關於Android編程
前面一篇文章介紹了二級Preference的使用和特點,接下來進入系統給我提供的底級Preference的使用CheckBox選擇項CheckBoxPreference、EditText編輯對話框EditTextPreference、列表選擇ListPreference、多項選擇MultiSelectListPreference、 開關選擇SwitchPreference的應用和管理。以期大家能在學習的時候不僅僅只是會用,更應該知其然而知其所以然。
首先還是再來回顧下Preference系的樹形結構圖,加深下他們之間的繼承關系。
DialogPreference是一個抽象類直接繼承自Preference,它的獨特之處在於它是基於Dialog的,也就是說但我們點擊對應的DialogPreference系時是以Dialog形式展現的。系統給我們提供了以下幾個它的子類:EditTextPreference、ListPreference和MultiSelectListPreference。
我們都知道DialogPreference是基於Dialog的,當我們點擊的時候會以對話框的形式顯示出來,所以除了繼承自Preference的屬性之外也還新增了很多自己獨有的屬性和方法。
這裡只列出三個有用的回調方法,其他setter、gettter方法和其他方法由於篇幅問題就不列出了(下同)。
vcmllcw==" xmlns:android="http://schemas.android.com/apk/res/android">
ListPreference和其他Preference一樣的機制,也是借助於SharedPreferences來實現存儲和更新,特別之處在於SharedPreferences存儲的是android:entryValues的值(即android:entryValues與key一一對應形成鍵值對),而顯示到界面的是android:entries則與android:entryValues一一對應。
列表數據源字符數組:
- Dota
- Dota2
- NBA2K10
- FIFA2K10
- 0
- 1
- 2
- 3
ListPreference的xml文件:
PreferenceActivity的實現:
public class ListPreferenceActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener{
private ListPreference preference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.list_preference);
init();
}
private void init(){
preference= (ListPreference) findPreference("key_listpreference");
///preference.setOnPreferenceClickListener(this); ****點擊事件已經被覆蓋掉了****
preference.setOnPreferenceChangeListener(this);
// 設置summary為所選中的值列表值
if(preference.getEntry()!=null) {
preference.setSummary(preference.getEntry());//初始化時設置summary
}
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
/*newValue 返回的值是getEntries的值
* 01-09 12:30:43.558 15872-15872/com.crazymo.prerencescreen D/TAG2: onPreferenceChange run1
* 01-09 12:41:10.627 15872-15872/com.crazymo.prerencescreen D/TAG2: onPreferenceChange run2
* */
if(preference instanceof ListPreference) {
ListPreference listPreference = (ListPreference) preference;//把preference這個Preference強制轉化為ListPreference類型
CharSequence[] entries = listPreference.getEntries();//獲取ListPreference中的實體內容
int index = listPreference.findIndexOfValue((String) newValue);//獲取ListPreference中的實體內容的下標值
listPreference.setSummary(entries[index]);//listPreference中的sumamry顯示為當前ListPreference的實體內容中選擇的
Log.d("TAG2", "onPreferenceChange run"+newValue);
Toast.makeText(ListPreferenceActivity.this,entries[index].toString(),Toast.LENGTH_LONG).show();
}
return true;
}
}
MultiSelectListPreference和ListPreference都是列表形式的DialogPreference,不同的是ListPreference提供單選列表,而在Android3.0之後可以通過MultiSelectListPreference來實現多選,所以他們的屬性和方法都幾乎是相同的,當然也包括使用基本語法,但是要注意一點由於要支持多選,所以MultiSelectListPreference的SharedPreferences保存的是集合set(我們應該有這個概念集合就是用於保存多個對象的),所以讀取數據的時候處理稍顯麻煩。
還是使用一樣的數據源,一樣的xml(把ListPreference改為MultiSelectListPreference其他不變)
public class MutilListPreferenceActivity extends PreferenceActivity implements OnPreferenceChangeListener {
private MultiSelectListPreference preference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.list_preference);
preference= (MultiSelectListPreference) findPreference("key_listpreference");
preference.setOnPreferenceChangeListener(this);
initFromSharedPreferences();
}
private void initFromSharedPreferences(){
String summary=null;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
Setoptions = prefs.getStringSet("key_listpreference", null); //因不設置初始值,所以要進行null的判斷
if(options!=null) {
CharSequence[] extras = preference.getEntries();
for (String op : options) {
int index = preference.findIndexOfValue(op);
if (summary==null) {
summary="";
}
summary = summary + extras[index]; }
preference.setSummary(summary);
}
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if(preference instanceof MultiSelectListPreference) {
String summary=null;
MultiSelectListPreference multiSelectListPreference=(MultiSelectListPreference)preference;
CharSequence[] extras = multiSelectListPreference.getEntries();
Set options=(Set)newValue;
for (String op : options){
int index = multiSelectListPreference.findIndexOfValue(op);
Log.d("TAG2", op + extras[index]);
if(summary==null) {
summary="";
}
summary = summary + extras[index];
}
Log.d("TAG2","onPreferenceChange:::"+summary);
multiSelectListPreference.setSummary(summary);
}
return true;
}
}
/**Log
*01-10 10:31:57.233 6089-6089/com.crazymo.prerencescreen D/TAG2: 1Dota2
01-10 10:31:57.234 6089-6089/com.crazymo.prerencescreen D/TAG2: 2NBA2K10
01-10 10:31:57.234 6089-6089/com.crazymo.prerencescreen D/TAG2: onPreferenceChange:::Dota2NBA2K10
*/
TwoStatePreference也是一個抽象類,作用如字面意思。是基於兩種可選狀態的首選項基類,他沒有新增獨特的屬性,全都是繼承上級,在SharedPreferences裡通過維護一個布爾值(checked時為true)來設置當前狀態的啟用和禁止的一種Preference。Android也為我們提供了兩種:CheckBox選擇項CheckBoxPreference和 開關選擇SwitchPreference供我們直接使用。
res/xml/widget_layout.xml
每次點擊的時候先執行onChange再執行onClick:
01-10 11:16:56.459 31292-31292/com.crazymo.prerencescreen D/TAG2: true
01-10 11:16:56.464 31292-31292/com.crazymo.prerencescreen D/TAG2: CheckBox Clicked!!
01-10 11:36:19.660 31292-31292/com.crazymo.prerencescreen D/TAG2: false
01-10 11:36:19.662 31292-31292/com.crazymo.prerencescreen D/TAG2: CheckBox Clicked!!
每次點擊的時候先執行onChange再執行onClick:
01-10 11:47:55.554 12915-12915/com.crazymo.prerencescreen D/TAG2: true
01-10 11:47:55.559 12915-12915/com.crazymo.prerencescreen D/TAG2: SwitchPrefeence Clicked
通過這兩篇文章我們終於把Preference的應用和一些簡單原理給弄清楚了,其實這並不需要我們去背語法或者api什麼的,我們要從原理去理解,從他們的結構關系去理解,究其根本。Preference只不過是把自己的key作為SharedPreferences裡的key保存數據,進而再再次進入界面的時候由Activity去自動讀取並刷新UI,不同的Preference保存的SharedPreferences格式不一樣,比如說TwoStatePreference保存的是boolean的鍵值對,ListPreference則保存普通的字符串鍵值對;MultiSelectListPreference由於要保存多組數據則采取的是保存set集合等等,原理可以歸結為兩步:SharedPreferences的數據保存和PreferenceActivity讀取SharedPrefences的數據並更新。
今天項目中要實現一個天氣的預覽,加載的信息很多,字段也很多,所以理清了一下思路,准備獨立出來寫一個總結,這樣對大家還是很有幫助的,老司機要開車了 涉及到網絡
本文實例分析了Android編程畫圖之抗鋸齒解決方法。分享給大家供大家參考,具體如下:在畫圖的時候,圖片如果旋轉或縮放之後,總是會出現那些華麗的鋸齒。其實Android自
BinaryTree線索化二叉樹>二叉樹是一種非線性結構,在之前實現的二叉樹遍歷中不管是遞歸還是非遞歸用二叉樹作為存儲結構時只能取到該結點的左孩子和右孩子,不能得到
前言本篇博客紀錄使用Android Studio對項目進行簽名打包,跟Eclipse大同小異,讀者朋友注意其中到差別。第一步 創建簽名文件第二步 填寫簽名參數第三步 選擇