Кнопка Android с разными цветами фона - PullRequest
35 голосов
/ 18 сентября 2010

Я хочу изменить цвет фона кнопки, используя selector-xml-file.Мой подход в основном такой, как в примере внизу этой страницы: http://developer.android.com/guide/topics/resources/color-list-resource.html

У меня есть файл res / color / button_text.xml, который выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:color="#ffff0000"/> <!-- pressed -->
    <item android:state_focused="true"
          android:color="#ff0000ff"/> <!-- focused -->
    <item android:color="#ff000000"/> <!-- default -->
</selector>

и моймакет содержит следующий код:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/button_text"
    **android:background="@color/button_text"** /> 

(** только там, чтобы показать вам, что я использую android: фон вместо android: textcolor)

этот код падает.он говорит: «Для строки № 4 двоичного XML-файла требуется атрибут drawable или дочерний тег, определяющий drawable. Но если я попробую его с android: textColor, как описано в приведенной выше ссылке, то он будет работать нормально. Так что это должно быть фоновой проблемой.не хочу создавать 9patch-png, если в этом нет необходимости (в основном мне просто нужен «кликабельный» прямоугольник, поэтому я использую кнопку с цветным фоном)

Ответы [ 4 ]

80 голосов
/ 18 сентября 2010

Как говорится в вашей ошибке, вы должны определить drawable attibute для элементов (по какой-то причине это требуется, когда речь идет об определениях фона), поэтому:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/red"/> <!-- pressed -->
    <item android:state_focused="true" android:drawable="@color/blue"/> <!-- focused -->
    <item android:drawable="@color/black"/> <!-- default -->
</selector>

Также обратите внимание, что атрибут drawable не принимает необработанные значения цвета, поэтому вы должны определить цвета как ресурсы. Создайте файл colors.xml в res / values ​​ папка:

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <color name="black">#000</color>
     <color name="blue">#00f</color>
     <color name="red">#f00</color>
</resources>
28 голосов
/ 25 августа 2011

В указанном вами URL-адресе button_text.xml используется для установки атрибута textColor. Именно поэтому у них есть button_text.xml в папке res / color, и поэтому они использовали @ color / button_text.xml

Но вы пытаетесь использовать его для атрибута фона. Атрибут background ищет что-то в папке res / drawable.

отметьте это, я получил эту селекторную кнопку из интернета. У меня нет ссылки. Но я благодарю за это постер. Мне помогло. У меня есть это в папке drawable

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <gradient
                android:startColor="@color/yellow1"
                android:endColor="@color/yellow2"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

    <item android:state_focused="true" >
        <shape>
            <gradient
                android:endColor="@color/orange4"
                android:startColor="@color/orange5"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

    <item>        
        <shape>
            <gradient
                android:endColor="@color/white1"
                android:startColor="@color/white2"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

</selector>

И я использовал в своем макете main.xml вот так

<Button android:id="@+id/button1"
            android:layout_alignParentLeft="true"
            android:layout_marginTop="150dip"
            android:layout_marginLeft="45dip"
            android:textSize="7pt"
            android:layout_height="wrap_content"
            android:layout_width="230dip"
            android:text="@string/welcomebtntitle1"
            android:background="@drawable/custombutton"/>

Надеюсь, это поможет. Вик прав.

РЕДАКТИРОВАТЬ: Вот это colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="yellow1">#F9E60E</color>
   <color name="yellow2">#F9F89D</color>
   <color name="orange4">#F7BE45</color>
   <color name="orange5">#F7D896</color>
   <color name="blue2">#19FCDA</color>
   <color name="blue25">#D9F7F2</color>
   <color name="grey05">#ACA899</color>
   <color name="white1">#FFFFFF</color>
   <color name="white2">#DDDDDD</color>
</resources>
4 голосов
/ 16 августа 2011

Вы должны поместить файл selector.xml в папку drwable. Затем написать: android:background="@drawable/selector". Это заботится о нажатых и сфокусированных состояниях.

2 голосов
/ 09 марта 2012

в Mono Android вы можете использовать фильтр следующим образом:

your_button.Background.SetColorFilter(new Android.Graphics.PorterDuffColorFilter(Android.Graphics.Color.Red, Android.Graphics.PorterDuff.Mode.Multiply));
...