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>

浙公网安备 33010602011771号