2016-02-12 2 views
1

У меня есть button и selector, который должен изменить color, padding и corner radius в button. У меня нет проблем с изменением color, но я не вижу никаких изменений с padding и corner radius.Android форма кнопки в селекторе не работает

button_color.xml

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

<item android:drawable="@color/button_disabled" android:state_enabled="false"> 
    <shape 
     android:shape="rectangle" 
     android:padding="8dp"> 
     <corners android:radius="4dp" /> 

    </shape> 
</item> 
<item android:drawable="@color/button_pressed" android:state_pressed="true"> 
    <shape 
     android:shape="rectangle" 
     android:padding="8dp"> 
     <corners android:radius="4dp" /> 

    </shape> 
</item> 
<item android:drawable="@color/button_focused" android:state_focused="true"> 
    <shape 
     android:shape="rectangle" 
     android:padding="8dp"> 
     <corners android:radius="4dp" /> 

    </shape> 
</item> 
<item android:drawable="@color/colorAccent"> 
    <shape 
     android:shape="rectangle" 
     android:padding="8dp"> 
     <corners android:radius="4dp" /> 
    </shape> 
</item> 

</selector> 

код button:

<LinearLayout> 

    .... 
    <Button 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/add_to_fav" 
    android:id="@+id/add" 
    android:background="@drawable/button_color" 
    android:textColor="@drawable/button_text_color" /> 
    </LinearLayout> 

Я знаю, что некоторые неуклюжий способ получить padding - поместить его в макете, но 1) это было бы "бесполезным родителем" ; 2) Я бы не получил corner radius.

Так что я делаю неправильно, поэтому у меня нет shape?

Спасибо!

ответ

2

Перетяжка, цвет и углы должны быть внутри shape

Так попробуйте это:

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

    <item android:state_enabled="false"> 
     <shape> 
      <padding android:left="5dp" android:top="2dp" 
        android:right="5dp" android:bottom="2dp" /> 
      <corners android:radius="4dp" /> 
      <solid android:color="@color/colorPrimary"/> 
     </shape> 
    </item> 
    <item android:state_pressed="true"> 
     <shape> 
      <padding android:left="5dp" android:top="2dp" 
        android:right="5dp" android:bottom="2dp" /> 
      <corners android:radius="4dp" /> 
      <solid android:color="@color/colorAccent"/> 
     </shape> 
    </item> 
    <item android:state_focused="true"> 
     <shape> 
      <padding android:left="5dp" android:top="2dp" 
        android:right="5dp" android:bottom="2dp" /> 
      <corners android:radius="4dp" /> 
      <solid android:color="@color/colorPrimary"/> 
     </shape> 
    </item> 
    <item> 
     <shape> 
      <padding android:left="5dp" android:top="2dp" 
        android:right="5dp" android:bottom="2dp" /> 
      <solid android:color="@color/colorPrimaryDark"/> 
      <corners android:radius="4dp" /> 
     </shape> 
    </item> 

</selector> 

Таким образом, все они будут работать.

+0

Действительно! Он изменил «угловой радиус»! Но заполнение оставило то же самое, поэтому разрешите это через «margin». Большое спасибо! –

1

Значение android:radius было слишком маленьким, чтобы эффект был видимым. Синтаксис padding с другой стороны, должен быть изменен следующим образом:

<item android:drawable="@color/button_focused" android:state_focused="true"> 
    <shape 
     android:shape="rectangle"> 
     <corners android:radius="20dip" /> 
     <padding 
      android:left="8dip" 
      android:top="8dip" 
      android:right="8dip" 
      android:bottom="8dip" /> 

    </shape> 
</item> 

Обратите внимание: как указано в documentation for Shape Drawable,

Перетяжка обратиться к вмещающей View элемента (это накладывает положение содержимого View, а не на форму).