有時候系統提供給我們的preference并不能滿足我們的要求,是以有的時候需要我們自定義preferece,下面的例子就是我個人自定義的一個簡單的帶圖示的preference。
首先是xml布局檔案,就是你想實作的布局。
[java] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+android:id/widget_frame"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minheight="?android:attr/listpreferreditemheight"
android:gravity="center_vertical"
android:paddingright="?android:attr/scrollbarsize">
<relativelayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="18dip"
android:layout_marginright="6dip"
android:layout_margintop="6dip"
android:layout_marginbottom="6dip"
android:layout_weight="1">
<textview
android:id="@+android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleline="true"
android:textappearance="?android:attr/textappearancelarge"
android:ellipsize="marquee"
android:fadingedge="horizontal" />
android:id="@+android:id/summary"
android:layout_below="@android:id/title"
android:layout_alignleft="@android:id/title"
android:textappearance="?android:attr/textappearancesmall"
android:maxlines="2" />
</relativelayout>
<imageview
android:id="@+id/icon"
android:layout_marginleft="6dip"
android:layout_gravity="center" />
</linearlayout>
下面是自定義的preference的java檔案:
import com.android.mms.r;
import android.content.context;
import android.graphics.drawable.drawable;
import android.preference.preference;
import android.util.attributeset;
import android.view.view;
import android.widget.imageview;
public class iconlistpreference extends preference{
private drawable micon;
public iconlistpreference(final context context, final attributeset attrs, final int defstyle) {
super(context, attrs);
this.setlayoutresource(r.layout.icon_list_preference);
//這裡設定的是icon初始化的圖示
this.micon = context.getresources().getdrawable(r.drawable.ycz20_black);
}
public iconlistpreference(final context context, final attributeset attrs) {
this(context, attrs, 0);
@override
protected void onbindview(final view view) {
super.onbindview(view);
final imageview imageview = (imageview)view.findviewbyid(r.id.icon);
if ((imageview != null) && (this.micon != null)) {
imageview.setimagedrawable(this.micon);
}
/**
* sets the icon for this preference with a drawable.
*
* @param icon the icon for this preference
*/
public void seticon(final drawable icon) {
if (((icon == null) && (this.micon != null)) || ((icon != null) && (!icon.equals(this.micon)))) {
this.micon = icon;
this.notifychanged();
public void seticon(int iconres) {
if(r.drawable.ycz20_black!=iconres){
this.micon = getcontext().getresources().getdrawable(iconres);
* returns the icon of this preference.
* @return the icon.
* @see #seticon(drawable)
public drawable geticon() {
return this.micon;
}
比如你想更改imageview裡面的圖示,就是以使用seticon()方法。
因為自己完成的功能比較簡單,是以重寫的方法就比較少,大家 可以根據自己的需要來添加更多的方法。
上面隻是實作一個perference,但是點選以後沒有響應事件,我們可以定義一個一個dialog,dialog選項裡面需要有圖檔,文字說明,後面還需要一個單選按鈕,是以自己寫了一個demo,效果圖如下:
功能的完成是使用dialog的addview()方法,把一個listview添加進去。listview控件裡面使用了imageview和checkedtextview控件,checkedtextview是一個提供文字和選擇框的控件。如果對于checkedtextview不熟悉,請自己查下文檔,在這裡就不在多說。
主要功能代碼如下:
public class listviewactivityextends activity {
/** called when the activity is first created. */
public void oncreate(bundle savedinstancestate){
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
button button=(button)findviewbyid(r.id.button);
//擷取listview
final layoutinflater factory = layoutinflater.from(listviewactivity.this);
final view view = factory.inflate(
r.layout.listview,null);
final listview list = (listview) view.findviewbyid(r.id.listview01);
//把資料項添加到listitem裡面
arraylist<hashmap<string,object>> listitem =newarraylist<hashmap<string, object>>();
for(int i=0;i<5;i++)
{
if(i==0){
hashmap<string,object> map =new hashmap<string,object>();
map.put("itemimage", r.drawable.checked);
map.put("itemtitle", "1");
listitem.add(map);
}else if(i==1){
map.put("itemimage", r.drawable.c);
map.put("itemtitle", "2");
}else if(i==2){
map.put("itemimage", r.drawable.d);
map.put("itemtitle", "3");
}else if(i==3){
map.put("itemtitle", "4");
}else{
map.put("itemimage", r.drawable.e);
map.put("itemtitle", "5");
//獲得simpleadapter,并且把它添加到listview中
simpleadapter listitemadapter =new simpleadapter(this,listitem,
r.layout.item,
new string[] {"itemimage","itemtitle"},
new int[] {r.id.imageview,r.id.checkedtextview}
);
list.setadapter(listitemadapter);
list.setonitemclicklistener(new onitemclicklistener(){
public void onitemclick(adapterview<?>arg0, view arg1,int arg2,
long arg3) {
//把所有的單選全部設為非選中
for(int i=0;i<arg0.getcount();i++)
{
view v = list.getchildat(i);
checkedtextviewchecktext=(checkedtextview)v.findviewbyid(r.id.checkedtextview);
checktext.setchecked(false);
}
//獲得點選項的checkedtextview,并設為選中
checkedtextviewcheck=(checkedtextview)arg1.findviewbyid(r.id.checkedtextview);
check.setchecked(true);
}
});
final alertdialog.builder builder=new alertdialog.builder(listviewactivity.this);
button.setonclicklistener(new view.onclicklistener() {
public void onclick(view v) {
builder.settitle("dialog");
builder.setview(list);
builder.setnegativebutton("cencel",null);
builder.create().show();
}
其中item.xml代碼如下
[html] view
<?xml version="1.0"encoding="utf-8"?>
android:orientation="horizontal"
android:layout_height="fill_parent"
>
android:id="@+id/imageview"
/>
<checkedtextview xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/checkedtextview"
android:layout_width="match_parent"
android:layout_height="?android:attr/listpreferreditemheight"
android:textappearance="?android:attr/textappearancelarge"
android:checkmark="?android:attr/listchoiceindicatorsingle"
android:paddingleft="6dip"
android:paddingright="6dip"
/>
</linearlayout>
listview.xml檔案如下
<?xml version="1.0"encoding="utf-8"?>
<listview xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listview01"
/>
應該特别注意listview.xml不要把他寫在一個父控件下如:linearlayout等,如果這樣會出現錯誤,。還有就是如果你listview添加過多選項,當單擊的時候會出現空指針異常。
另外,demo源代碼可以在此下載下傳。
http://download.csdn.net/source/3494251
2012年7月19号補充:
當listview中含有超過一螢幕的時候,采用以上方法會有空指針異常,是因為未顯示的view為空,但是上面代碼中要周遊所有代碼,是以為空。如何優化,可以參考
這篇文章。
這篇文章原文是在https://gist.github.com/515681。主要是代碼,沒有其他文字說明,轉到這裡來,希望對看到的人有用。
下面是用到的xml布局檔案。
[html] view plaincopy
<linearlayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingright="?android:attr/scrollbarsize">
android:layout_marginleft="2dip"
<checkbox
android:id="@+android:id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginright="4dip"
android:layout_gravity="center_vertical"
android:focusable="false"
android:clickable="false" />
下面是用到的java類檔案。
[java] view plaincopy
import android.preference.checkboxpreference;
import com.jakewharton.wakkawallpaper.r;
public class iconcheckboxpreference extends checkboxpreference {
private drawable micon;
public iconcheckboxpreference(final context context, final attributeset attrs, final int defstyle) {
super(context, attrs, defstyle);
this.setlayoutresource(r.layout.icon_checkbox_preference);
this.micon = context.obtainstyledattributes(attrs, r.styleable.iconpreference, defstyle, 0).getdrawable(r.styleable.iconpreference_icon);
public iconcheckboxpreference(final context context, final attributeset attrs) {
如果有需要做類似功能的朋友們可以參照此例進行修改。