Android 自定义ListPreference

android-重写ListPrefrence添加一个OK按钮

效果图:

下面是源码:

自定义ListPreference源码:

package com.tangzq.customize;

 

import android.app.AlertDialog.Builder;

import android.content.Context;

import android.content.DialogInterface;

import android.preference.ListPreference;

import android.util.AttributeSet;

import android.util.Log;

 

public class MyListPreference extends ListPreference {

private static final String LOGTAG="MyListPreference";

 

private CharSequence[] entries;

private CharSequence[] entryValues;

private int selectedId;

private Context cxt;

private int indexOfValue;

 

public MyListPreference(Context context, AttributeSet attrs) {

super(context, attrs);

cxt=context;

}

 

//重写这个方法,用于同步Summary

@Override

protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {

// TODO Auto-generated method stub

super.onSetInitialValue(restoreValue, defaultValue);

entries = getEntries();

entryValues = getEntryValues();

String value= getValue();//这个可以删除,只是用于debug

 

indexOfValue=this.findIndexOfValue(getSharedPreferences().getString(this.getKey(), ""));

        Log.e(LOGTAG, "index:"+indexOfValue+",value:"+value);

        if(indexOfValue>=0){

       String key=String.valueOf(entries[indexOfValue]);

       Log.e(LOGTAG, "key:"+key+",value:"+value);

       if(null!=key){

       setSummary(key);

       }

        }

 

}

 

 

 

    //重写这个方法,添加一个OK按钮

@Override

protected void onPrepareDialogBuilder(Builder builder) {

// super.onPrepareDialogBuilder(builder);//不能调用父类的这个方法,否则点击列表项会关闭对话框

builder.setSingleChoiceItems(entries, indexOfValue, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

Log.v(LOGTAG, String.valueOf(which));

selectedId=which;

}

});

 

 

// builder.setPositiveButton(null, null);//ListPreference源码中设置是这样写的,这里我们需要重写

   builder.setPositiveButton(getPositiveButtonText()==null?"OK":getPositiveButtonText(), new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface paramDialogInterface, int paramInt) {

if(selectedId>=0){

                setSummary(entries[selectedId]);

paramDialogInterface.dismiss();

MyListPreference.this.persistString(entryValues[selectedId].toString());

MyListPreference.this.callChangeListener(entryValues[selectedId]);

}

}

 

});

}

}

 

SettingActivity代码:

public class SettingActivity extends PreferenceActivity {

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.my_prefrence);

}

}

 

 

 

my_prefrence.xml中MyListPreference源码:

        <com.tangzq.customize.MyListPreference

            android:key="myBgColor"

            android:title="项目中使用到的自定义ListPreference"

            android:dialogIcon="@android:drawable/ic_menu_more"

            android:dialogTitle="颜色"

            android:entries="@array/colors_key"

            android:entryValues="@array/colors_value"

            android:summary="Black"

            android:defaultValue="#000000"/>

 

 

下面是在res/values/array.xml文件中定义对应的选项:

<string-array name="colors_key">

<item>Red</item>

<item>Green</item>

<item>Blue</item>

<item>Black</item>

</string-array>

<string-array name="colors_value">

<item>#FF0000</item>

<item>#00FF00</item>

<item>#0000FF</item>

<item>#000000</item>

</string-array>

 

<linker : http://hi.baidu.com/tzq668766/item/fad793ebfa2e6f0b65db0031>

posted @ 2013-10-08 19:42  MMLoveMeMM  阅读(1845)  评论(0)    收藏  举报