Android: изменить текст кнопки и цвет фона

как я могу изменить цвета текста и фона, когда моя кнопка нажата, с помощью xml ?

изменить цвет текста я могу сделать :

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="mycolor"/>
    <item android:color="mycolor2/>
</selector>

чтобы изменить фон, который я могу сделать (используя его в селекторе / элементе с drawable ссылкой):

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FF0079FF" />
</shape>

но как я могу сделать и то, и другое ? Допустим, я хочу иметь:

  • по умолчанию : черный текст / белый фон
  • нажата: белый текст / синий фон

EDIT: ответ

Я совсем забыл, что цвет фона и текста управляются отдельно, так что вот как я это сделал:

<Button
    android:textColor="@color/filtersbuttoncolors"
    android:background="@drawable/mybackgroundcolors" />

в mybackgroundcolors.xml я управляю фоном и в filtersbuttoncolors.xml я управляю цветом текста. В обоих xml-файлах я управляю статусом (нажата, выбрана, по умолчанию)

6 ответов


вот пример drawable, который будет белым по умолчанию, черным при нажатии:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape>
            <solid
                android:color="#1E669B"/>
            <stroke
                android:width="2dp"
                android:color="#1B5E91"/>
            <corners
                android:radius="6dp"/>
            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"/>
        </shape>

    </item>
    <item>
        <shape>
            <gradient
                android:angle="270"
                android:endColor="#1E669B"
                android:startColor="#1E669B"/>
            <stroke
                android:width="4dp"
                android:color="#1B5E91"/>
            <corners
                android:radius="7dp"/>
            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"/>
        </shape>
    </item>
</selector>

Я думаю, что делать это намного проще:

button.setBackgroundColor(Color.BLACK);

а нужно import android.graphics.Color; нет: import android.R.color;

или вы можете просто написать 4-байтовый шестнадцатеричный код (не 3-байтовый) 0xFF000000 где первый байт устанавливает Альфа.


С уровня API 21 Вы можете использовать:

android:backgroundTint="@android:color/white"

вам нужно только добавить это в свой xml


добавить ниже строку в стилях.в XML

<style name="AppTheme.Gray" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorButtonNormal">@color/colorGray</item>
    </style>

кнопка in, добавить android:theme="@style/AppTheme.Gray", например:

<Button
            android:theme="@style/AppTheme.Gray"
            android:textColor="@color/colorWhite"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@android:string/cancel"/>

при создании приложения, файл под названием стили.xml будет создан в папке res/values. Если вы измените стили, вы можете изменить фон, цвет текста и т. д. для всех ваших макетов. Таким образом, вам не нужно входить в каждый отдельный макет и изменять его вручную.

стили.XML-код:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="Theme.AppBaseTheme" parent="@android:style/Theme.Light">
    <item name="android:editTextColor">#295055</item> 
    <item name="android:textColorPrimary">#295055</item>
    <item name="android:textColorSecondary">#295055</item>
    <item name="android:textColorTertiary">#295055</item>
    <item name="android:textColorPrimaryInverse">#295055</item>
    <item name="android:textColorSecondaryInverse">#295055</item>
    <item name="android:textColorTertiaryInverse">#295055</item>

     <item name="android:windowBackground">@drawable/custom_background</item>        
</style>

<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>

parent="@android:style/Theme.Light" это родные цвета Google. Вот ссылка на то, что родные стили являются: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/themes.xml

name="Theme.AppBaseTheme" означает, что вы создаете стиль, который наследует все стили от parent="@android:style/Theme.Light". Эту часть можно игнорировать, если вы не хотите снова наследовать от AppBaseTheme. = <style name="AppTheme" parent="AppBaseTheme">

@drawable / custom_background-это пользовательское изображение, которое я помещаю в папку drawable. Это изображение 300x300 png.

#295055 темно-синий цвет.

мой код изменяет цвет фона и текста. Для текста кнопки, пожалуйста, просмотрите родной stlyes Google (ссылка, которую я дал u выше).

затем в Манифесте Android, не забудьте включить код:

<application
android:theme="@style/Theme.AppBaseTheme">

просто дополняя ответ @Jonsmoke's.

для API уровня 21 и выше вы можете использовать:

android:backgroundTint="@android:color/white"

в XML для макета кнопки.

для уровня API ниже 21 используйте AppCompatButton используя app пространство имен вместо android на backgroundTint.

например:

<android.support.v7.widget.AppCompatButton
    android:id="@+id/my_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="My Button"
    app:backgroundTint="@android:color/white" />