package org.aisen.weibo.sina.ui.widget; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.os.Build; import android.os.Bundle; import android.preference.ListPreference; import android.util.AttributeSet; import com.afollestad.materialdialogs.AlertDialogWrapper; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Created by wangdan on 15/4/27. */ public class AisenListPreference extends ListPreference { public AisenListPreference(Context context, AttributeSet attrs) { super(context, attrs); } private AlertDialog.Builder mBuilder; @Override protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { super.onPrepareDialogBuilder(builder); mBuilder = builder; } private String getFieldValue(String filed) throws Exception { Field titleField = AisenListPreference.class.getSuperclass().getSuperclass().getDeclaredField(filed); titleField.setAccessible(true); String dialogTitle = titleField.get(this).toString(); return dialogTitle; } @Override protected void showDialog(Bundle state) { try { if (Build.VERSION.SDK_INT < 100) { CharSequence[] mEntries = getEntries(); String[] mEntriesStrArr = new String[mEntries.length]; for (int i = 0; i < mEntries.length; i++) mEntriesStrArr[i] = mEntries[i].toString(); Method method = AisenListPreference.class.getSuperclass().getDeclaredMethod("getValueIndex"); method.setAccessible(true); int mClickedDialogEntryIndex = Integer.parseInt(method.invoke(this).toString()); String dialogTitle = getFieldValue("mDialogTitle"); String mNegativeButtonText = getFieldValue("mNegativeButtonText"); new AlertDialogWrapper.Builder(getContext()) .setTitle(dialogTitle) .setSingleChoiceItems(mEntriesStrArr, mClickedDialogEntryIndex, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { try { Field titleField = AisenListPreference.class.getSuperclass().getDeclaredField("mClickedDialogEntryIndex"); titleField.setAccessible(true); titleField.set(AisenListPreference.this, which); } catch (Exception e) { } AisenListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); dialog.dismiss(); } }) .setOnDismissListener(AisenListPreference.this) .setNegativeButton(mNegativeButtonText, AisenListPreference.this) .show(); } else { super.showDialog(state); } } catch (Exception e) { super.showDialog(state); } } }