Non è possibile creare lo stile ListPreference
da XML. Il problema è che ListPreference
(tramite DialogPreference
) chiama AlertDialog.Builder(Context)
per creare il suo Dialog
anziché AlertDialog.Builder(Context context, int themeResourceId)
. Mentre quest'ultimo consente di fornire un tema, il primo non lo fa, causando il ritorno a un tema Android predefinito.
Per un progetto, ho bisogno di un ListPreference
con un titolo-colore personalizzato, un radiobutton in stile personalizzato e un costume ListView selettore (in pratica, Holo in un colore diverso). Ho risolto questo problema estendendo ListPreference
e sostituendo onPrepareDialogBuilder(Builder)
e OnCreateDialogView()
in modo da poter utilizzare un ListView personalizzato con un semplice ArrayAdapter, anziché Dialog
incorporato nello ListView
(che non supporta lo stile). Ho anche dovuto ignorare lo onDialogClosed()
per impostare il valore corretto sulla preferenza.
Per poterlo utilizzare, è sufficiente sostituire il nome classe della preferenza nelle preferenze.xml da ListPreference
a com.your.packagename.ThemedListPreference
. Oltre a ciò, l'implementazione è identica a ListPreference.
public class ThemedListPreference extends ListPreference implements OnItemClickListener {
public static final String TAG = "ThemedListPreference";
private int mClickedDialogEntryIndex;
private CharSequence mDialogTitle;
public ThemedListPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ThemedListPreference(Context context) {
super(context);
}
@Override
protected View onCreateDialogView() {
// inflate custom layout with custom title & listview
View view = View.inflate(getContext(), R.layout.dialog_settings_updatetime, null);
mDialogTitle = getDialogTitle();
if(mDialogTitle == null) mDialogTitle = getTitle();
((TextView) view.findViewById(R.id.dialog_title)).setText(mDialogTitle);
ListView list = (ListView) view.findViewById(android.R.id.list);
// note the layout we're providing for the ListView entries
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(
getContext(), R.layout.btn_radio,
getEntries());
list.setAdapter(adapter);
list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
list.setItemChecked(findIndexOfValue(getValue()), true);
list.setOnItemClickListener(this);
return view;
}
@Override
protected void onPrepareDialogBuilder(Builder builder) {
// adapted from ListPreference
if (getEntries() == null || getEntryValues() == null) {
// throws exception
super.onPrepareDialogBuilder(builder);
return;
}
mClickedDialogEntryIndex = findIndexOfValue(getValue());
// .setTitle(null) to prevent default (blue)
// title+divider from showing up
builder.setTitle(null);
builder.setPositiveButton(null, null);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
mClickedDialogEntryIndex = position;
ThemedListPreference.this.onClick(getDialog(), DialogInterface.BUTTON_POSITIVE);
getDialog().dismiss();
}
@Override
protected void onDialogClosed(boolean positiveResult) {
// adapted from ListPreference
super.onDialogClosed(positiveResult);
if (positiveResult && mClickedDialogEntryIndex >= 0
&& getEntryValues() != null) {
String value = getEntryValues()[mClickedDialogEntryIndex]
.toString();
if (callChangeListener(value)) {
setValue(value);
}
}
}
}
Per gli elementi ListView ho utilizzato il layout di seguito. Nota che drawable/btn_radio_holo_light è un drawable XML come quello nella tua cartella android-sdk/platforms/android-x/data/res/drawable, solo con riferimenti a diversi drawable.
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checkMark="@drawable/btn_radio_holo_light"
android:gravity="center_vertical"
android:minHeight="@dimen/list_item_minheight"
android:paddingLeft="@dimen/list_item_paddingLeft"
android:paddingRight="@dimen/list_item_paddingLeft" />
Per il mio layout Dialog (onCreateDialogView()
), ho usato il seguente: risposta
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/dialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:textColor="@color/title_color"
android:textSize="22sp" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/divider_color" />
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="@drawable/list_selector" />
</LinearLayout>
plz I m in attesa –