天天看點

自定義帶圖示的Preferecnce-----類ListPreference實作

   有時候系統提供給我們的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,效果圖如下:

自定義帶圖示的Preferecnce-----類ListPreference實作

        功能的完成是使用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) {  

如果有需要做類似功能的朋友們可以參照此例進行修改。

繼續閱讀