2012-05-05 15 views
11

Ho personalizzato tutti i radioButton nella mia applicazione ma i radioButton in listPreference non vengono personalizzati.Come personalizzare il pulsante di scelta dell'elenco delle preferenze

Ho usato questo XML denominato btn_radio.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_checked="true" android:state_window_focused="false" 
     android:drawable="@drawable/radio_selected" /> 
<item android:state_checked="false" android:state_window_focused="false" 
     android:drawable="@drawable/radio_unselected" /> 

<item android:state_checked="true" android:state_pressed="true" 
     android:drawable="@drawable/radio_selected" /> 
<item android:state_checked="false" android:state_pressed="true" 
     android:drawable="@drawable/radio_unselected" /> 

<item android:state_checked="true" android:state_focused="true" 
     android:drawable="@drawable/radio_selected" /> 
<item android:state_checked="false" android:state_focused="true" 
     android:drawable="@drawable/radio_unselected" /> 

<item android:state_checked="false" android:drawable="@drawable/radio_unselected" /> 
<item android:state_checked="true" android:drawable="@drawable/radio_selected" /> 
</selector> 

Questa è la customRadioButton che si estende sul pulsante di opzione Android personalizzato

<style name="CustomRadioButton" Parent="@android:style/Widget.CompoundButton.RadioButton"> 
    <item name="android:button">@drawable/btn_radio</item> 
</style> 

nel tema della mia richiesta ho fatto questo cambia

<item name="android:radioButtonStyle">@style/CustomRadioButton</item> 
    <item name="android:listChoiceIndicatorSingle">@style/CustomRadioButton</item> 

Queste modifiche personalizzano e tutti i radioButton nella mia applicazione eccetto i radioButton nella mia listaPreferenza

+0

plz I m in attesa –

risposta

24

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> 
+0

ciò che è 'CheckedTextView' qui, c'è da visualizzazione personalizzata creata. Potresti per favore guidare. – Dory

+0

cosa dovrebbe essere in questo layout '' R.layout.btn_radio'. – Dory

+0

@NidhiGondhia, [CheckedTextView] (http://developer.android.com/reference/android/widget/CheckedTextView.html) è un widget Android standard. Il frammento di codice che inizia con ' Felix