當咱們想給咱們的應用給一個設置頁面的時候,我第一反應就想到了PreferenceActivity,但咱們小組的頭說系統默認的PreferenceActivity不符合客戶的需求,我不甘心,就開始本身在網上尋找資料,訂製一個想要的PreferenceActivity頁面。java
功夫不負有心人,通過了2天的奮鬥終於出了成果,也很感謝網上那些分享成果的哥們,他們讓我受益良多。
下面是我本身訂製的PreferenceActivity的效果:
android
外面整個是一個PreferenceScreen,裏面包裹了5個Preference,前兩個是繼承了CheckBoxPreference,第三個是繼承了ListPreference,最後兩個是繼承了普通的Preference,不過爲它們專門添加了點擊事件。express
背景是白色的,代碼以下:apache
this.getListView().setBackgroundResource(R.drawable.preference_background);
由於PreferenceActivity實際上是繼承了ListActivity的,而它加載的整個View也是基於ListActivity中那個ListView的,因此直接設置就能夠了,不過好像使用setBackgroundColor()這個方法沒有效果,我也沒搞明白,有大神幫忙解答一下。
我在下面是我在res/xml目錄中資源文件的代碼:app
<?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2008 ZXing authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> </PreferenceScreen>
很簡單,裏面就只有一個PreferenceScreen,全部其餘的元素所有使用代碼,在PreferenceActivity中獲取這個PreferenceScreen,而後動態的將Preference逐一加入到這個容器裏面。
private void initPreferenceScreen() { addPreferencesFromResource(R.xml.preferences); mPreferenceScreen = getPreferenceScreen(); mPreferenceScreen.setOrderingAsAdded(true); this.getListView().setBackgroundResource( R.drawable.preference_background); }
什麼?你還不懂或者擔憂每次啓動APP的時候都會從新初始化,沒法記錄用戶之前進行過的操做?
別擔憂,PreferenceActivity在每次退出後都會自動記錄下當前頁面的設置,下次啓動時會自動加載。less
下面開始說最關鍵的Preference.
因爲時間問題,我就說說第一幅圖的第四個Preference,咱們要實現的功能是:點擊它以後,到雲端去檢查版本更新。
首先,貼上樓主寫的代碼,繼承了Preference,實現了點擊事件和圖片設置。
ide
public class ImagePreference extends Preference { private ImageView iv_perference_icon; private int _id; private OnClickListener mOnClickListener; public ImagePreference(Context context,int id) { super(context); this._id = id; setLayoutResource(R.layout.preference_list_item_layout); } @Override protected void onBindView(View view) { super.onBindView(view); iv_perference_icon = (ImageView) view.findViewById(R.id.iv_perference_icon); iv_perference_icon.setImageResource(_id); view.setClickable(true); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { if(mOnClickListener!=null) mOnClickListener.onClick(view); else return; } }); } public void setOnClickListener(OnClickListener mOnClickListener){ this.mOnClickListener = mOnClickListener; } }
你們能夠看到,在這個控件初始化的時候就是用了
<?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="wrap_content" android:background="@color/preference_background" android:gravity="center_vertical" android:minHeight="?android:listPreferredItemHeight" android:paddingRight="?android:scrollbarSize" > <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="1.0dip" android:layout_marginLeft="16.0dip" android:layout_marginRight="6.0dip" android:layout_marginTop="1.0dip" android:layout_weight="1.0" > <ImageView android:id="@+id/iv_perference_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:src="@drawable/ic_launcher" /> <TextView android:id="@android :id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/iv_perference_icon" android:paddingLeft="15dp" android:ellipsize="marquee" android:layout_centerVertical="true" android:fadingEdge="horizontal" android:singleLine="true" android:textColor="@color/preference_title" android:textSize="18.0sp" /> <TextView android:id="@android :id/summary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@android :id/title" android:layout_below="@android :id/title" android:paddingLeft="15dp" android:paddingTop="5dp" android:maxLines="4" android:textColor="@color/preference_summary" android:textSize="14.0sp" /> </RelativeLayout> <LinearLayout android:id="@android :id/widget_frame" android:layout_width="wrap_content" android:layout_height="fill_parent" android:gravity="center_vertical" android:orientation="vertical" /> </LinearLayout>
你們能夠看到,在裏面有一個ImageView,因此在控件onBindView(view)這個方法裏面咱們拿到了根View,再使用findViewById()這個方法就能夠獲得這個ImageView的引用啦,而後寫個接口,將根View的點擊事件傳遞到你的接口方法裏面就大功告成啦,接下來你就能夠將這個Preference加入到你的PreferenceScreen裏面,而後爲所欲爲的去創造本身的東西了。
private void initImagePreference() { pre_update = new ImagePreference(this, R.drawable.preference_versionupdate); pre_update.setKey(Intents.KEY_UPDATE); pre_update.setTitle(R.string.preferences_update_title); pre_update.setOrder(4); pre_update.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //You can do something here when somebady click this view. Toast.makeText(MoreActivity.this, "版本升級", 1).show(); } }); } private void addAllPreference() { mPreferenceScreen.addPreference(pre_update); }
可能有人會問我,你怎麼把PreferenceCategory隱藏掉的?
嗯,很簡單,有兩個方法:
1.爲你寫的PreferenceCategory添加自定義佈局,懂了吧!這個能夠是代碼設置,也支持XML文件設置。
2.在使用代碼動態添加Preference時,不添加PreferenceCategory就完事了,系統不會報錯的。佈局
好了,就寫到這裏吧,重點基本上都寫到了。樓主如今在上班,被上級發現了是要扣工資的。
還有有什麼不懂的能夠和樓主站內交流,樓主有空就會回的。ui
歡迎轉載啊,不過不要忽視做者的辛苦,請加上做者的連接http://my.oschina.net/freestyletime/blog/71544。this