Градиент в xml не возникает на кнопке

#android #xml #android-studio #android-layout

Вопрос:

Я создал градиент в своем файле ресурсов для рисования (.xml), а затем подключил его к кнопке (в activity_main.xml) предыстория. К сожалению, все структуры в этом файле не отображались на этой кнопке. Я новичок. Это проблема с кодом или что-то еще? Градиент работает как изображение и даже как переключатель, но не работает в качестве фона кнопки. Код от gradient.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <item>
        <shape>
              <gradient
                   android:angle="90"
                   android:endColor="#b5b6d2"
                   android:startColor="#555994"
                   android:type="linear" />
               <corners
                   android:radius="0dp"/>
               <padding
                   android:right="10dp"
                   android:top="10dp"
                   android:bottom="10dp"
                   android:left="10dp"/>
        </shape>
    </item>
</selector>
 

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@ id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:background="@drawable/gradient"
        android:text="@string/button"
        android:textColor="@android:color/white"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
 

Ответ №1:

Вы используете селектор, когда хотите отобразить другой фон / цвет в соответствии с различными состояниями виджета . В вашем случае замените свой код этим кодом в вашем файле для рисования :

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle">
<gradient
    android:angle="90"
    android:endColor="#b5b6d2"
    android:startColor="#555994"
    android:type="linear" />
<corners
    android:radius="0dp"/>

</shape>
 

Исправление : Виджет кнопки принимает colorAccent в качестве фона по умолчанию .Странно, измените виджет на кнопку AppCompat, и это решит проблему.

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.AppCompatButton
        android:id="@ id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="Button"
        android:background="@drawable/gradient"
        android:textColor="@android:color/white"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
 

Комментарии:

1. Пожалуйста , измените кнопку на кнопку AppCompat, вы сможете увидеть градиентный фон . @Szymon. Обновил свой ответ .

2. Градиент прослушивается, он построен из цветовых блоков, я хочу, чтобы градиент был линейным.

3. В соответствии с вашим вопросом вы не смогли установить фон градиента для кнопки ? Это решено ? Градиент линейный, я исправил только рисование, я не изменил форму/градиент . Какой линейный градиент вы хотите ?

4. Спасибо. Я проверил аппаратное устройство, и градиент на самом деле правильный. На виртуальной машине это выглядело немного неправильно. Спасибо вам за вашу помощь. Хорошая работа! 🙂

5. Я рад, что это помогло 🙂

Ответ №2:

селекторы используются для изменения представления при изменении состояний. Вы не указали никаких состояний в своем селекторе, так что, вероятно, поэтому он не применяется.

Если вы хотите, чтобы градиент применялся во всех состояниях, затем удалите селектор и элемент в xml и просто укажите форму.

Комментарии:

1. Я пробовал это раньше, и это тоже не работает

2. Пожалуйста, добавьте эту строку android:форма=»прямоугольник» в теге формы вместо тега селектора . <форма android:форма=»прямоугольник»><форма android:форма=»прямоугольник»></форма>