2010-09-17 2 views
34

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

я есть рес/цвет/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: фон вместо андроида: TextColor)

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

+0

ответ Константина есть опечатка - строка 'пункт андроида: цвет =» @ color/black "' .......... Я предлагаю, чтобы он читал элемент android: drawable = "@ color/black" ........... – 2011-02-09 12:22:59

+0

http: // stackoverflow. com/a/15880688/1352919 – Faakhir

ответ

77

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

<?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> 

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

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="black">#000</color> 
    <color name="blue">#00f</color> 
    <color name="red">#f00</color> 
</resources> 
+5

item android: color = "@ color/black" s/b item android: draw способный = "@ цвет/черный" – Noah

+0

@Noah thx, исправлено это. –

+0

Если это решило вашу проблему, примите это как ответ? –

4

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

27

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

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

проверить это я получил этот селектор пользовательской кнопки с internet.I не имею link.but я благодарю плакат для this.It помог me.have это в вытяжке папке

<?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"/> 

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

EDIT: Вот 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> 
+0

У вас есть файл color.xml, чтобы согласиться с этим? – electrichead

+0

@electrichead - Да, у меня есть. Я редактирую свой ответ. пожалуйста, посмотри. – Sreeram

+0

Я впервые увидел этот ответ, когда начал работать с Android, и мне пришлось бороться с количеством XML-кода, но через два месяца я снова столкнулся с ним, и это отличный ответ на общую проблему создания пользовательских цветов кнопок , без использования изображения. –

2

в Mono Android вы можете использовать фильтр, как это:

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

. Фон должен читать getbackground(). Другой вариант - использовать такой фильтр: myButton.getBackground(). SetColorFilter (новый LightingColorFilter (множитель, bckgrd_color)); – hornetbzz