2017-10-26 2 views
0

Ich habe einen ziemlich einfachen Dialog mit einem ArrayAdapter innerhalb. Der Adapter bläht das folgende Layout:Android Switch-Widget in AlertDialog, nicht zeigen Daumenbild (on/off statt)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:padding="10dp"> 

    <TextView 
     android:id="@+id/txt_description" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentStart="true" 
     android:layout_centerVertical="true" 
     android:layout_toStartOf="@+id/calendar_selection_switch" 
     android:ellipsize="end" 
     android:text="test test" 
     android:textColor="@color/black" 
     android:textSize="20sp" /> 

    <Switch 
     android:id="@id/calendar_selection_switch" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentEnd="true" 
     android:layout_centerVertical="true" 
     android:layout_gravity="end|center_vertical" 
     android:layout_marginStart="10dp" 
     android:minHeight="40dp" 
     android:minWidth="80dp" /> 
</RelativeLayout> 

Wenn ich diesen Dialog zeigen, das ist, was ich bekommen:

AlertDialog without the thumb image

Beachten Sie die Worte "on" und "off" in kleinen Buchstaben. Keine benutzerdefinierten Grafiken oder Klassen hier, nur Out-of-the-Box.

Wenn ich dies in einer Activity mache, bekomme ich das nicht. Stattdessen habe ich das normale Daumen Bild, das ist genau das, was ich will:

enter image description here

Auch wenn ich die Größe des Switch wachsen macht es keinen Unterschied machen. Es macht nur die Reihen der Liste größer.

Hier ist der Code, um den Dialog zu bauen und zeigen:

AlertDialog.Builder builderSingle = new AlertDialog.Builder(this); 
builderSingle.setTitle(R.string.cal_title); 

builderSingle.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     dialog.dismiss(); 
    } 
}); 

final CalendarListAdapter cla = new CalendarListAdapter(this, calendarList, null); 
builderSingle.setAdapter(cla, new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     cla.toggleSelect(which); 
    } 
}); 
builderSingle.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     if (saveCalendars(cla)) { 
      dialog.dismiss(); 
     } 
    } 
}); 
AlertDialog dialog = builderSingle.create(); 
dialog.show(); 

Die CalendarListAdapter ist ein einfaches ArrayAdapter: obwohl

public class CalendarListAdapter extends ArrayAdapter<Calendar> { 

Es gibt keinen Unterschied zwischen der Activity Version und der AlertDialog Version für diese Klasse .

Ich bin verwirrt. Was ich hier mache ist nicht sehr kompliziert. Bitte helfen Sie.

Antwort

0

Try this:

<Switch 
     android:id="@+id/calendar_selection_switch" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentEnd="true" 
     android:layout_centerVertical="true" 
     android:layout_gravity="end|center_vertical" 
     android:layout_marginStart="10dp" 
     android:minHeight="40dp" 
     android:minWidth="80dp" 
     android:textOn="" 
     android:textOff="" 
     android:switchMinWidth="48.0sp" 
     android:thumb="@drawable/switch_selector" 
     android:track="@drawable/switch_track" 
     android:checked="false"/> 

switch_selector.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_checked="true"> 
     <shape 
      android:shape="rectangle" 
      android:visible="true" 
      android:useLevel="false"> 
      <gradient 
       android:startColor="@color/white" 
       android:endColor="@color/white" 
       android:angle="270"/> 
      <corners 
       android:radius="14.0sp"/> 
      <size 
       android:width="28.0sp" 
       android:height="28.0sp" /> 
      <stroke 
       android:width="4.0sp" 
       android:color="#11000000"/> 
     </shape> 
    </item> 
    <item android:state_checked="false"> 
     <shape 
      android:shape="rectangle" 
      android:visible="true" 
      android:dither="true" 
      android:useLevel="false"> 
      <gradient 
       android:startColor="@color/white" 
       android:endColor="@color/white" 
       android:angle="270"/> 
      <corners 
       android:radius="16.0sp"/> 
      <size 
       android:width="28.0sp" 
       android:height="28.0sp" /> 
      <stroke 
       android:width="2.0sp" 
       android:color="#11000000"/> 
     </shape> 
    </item> 
</selector> 

switch_track.xml:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" 
    android:visible="true" 
    android:useLevel="false"> 
    <gradient 
     android:startColor="@color/white" 
     android:endColor="@color/white" 
     android:angle="270"/> 
    <stroke 
     android:width="2.0sp" 
     android:color="#11000000"/> 
    <corners 
     android:radius="14.0sp"/> 
    <size 
     android:width="42.0sp" 
     android:height="28.0sp" /> 
</shape> 

in Code Dann können Sie tun:

 aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        aSwitch.setTrackResource(R.drawable.switch_track_off); 
       } else { 
        aSwitch.setTrackResource(R.drawable.switch_track); 
       } 
      } 
     }); 

switch_track_off.xml:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" 
    android:visible="true" 
    android:useLevel="false"> 
    <gradient 
     android:startColor="#00A4FD" 
     android:endColor="#00A4FD" 
     android:angle="270"/> 
    <stroke 
     android:width="2.0sp" 
     android:color="#00A4FC"/> 
    <corners 
     android:radius="14.0sp"/> 
    <size 
     android:width="42.0sp" 
     android:height="28.0sp" /> 
</shape> 

können Sie die Farben und andere Stile ändern wie Sie es wünschen.

Soweit ich weiß, ist dies die einzige zuverlässige Möglichkeit, Switch in allen Android Versionen überall in der App gleich aussehen und fühlen.

Bitte hinterlassen Sie einen Kommentar, wenn es einen besseren Vorschlag gibt.

+0

Nun, ich denke nicht, dass dies eine Antwort auf die Frage ist, die ich stellte. Was ist, warum sieht der Switch anders aus, wenn er sich in einem AlertDialog befindet und wenn er sich in einer Aktivität befindet? – Emmanuel

+0

Ich könnte dies als Workaround verwenden, wenn nichts anderes funktioniert. – Emmanuel

+0

@Emmanuel verwenden Sie die 'support library' Version von' AlertDialog'?Ich denke, es liegt daran, 'drawable' in der' library' zu verfälschen. –