Кнопка Android drawableEnd Style Item - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть стиль кнопки, определенный в моем файле styles.xml.

<style name="Button" parent="Widget.AppCompat.Button.Borderless.Colored">
    <item name="android:drawablePadding">@dimen/padding_medium</item>
    <item name="android:paddingStart">@dimen/padding_medium</item>
    <item name="android:paddingEnd">@dimen/padding_medium</item>
    <item name="android:textAppearance">@style/ButtonTextAppearance</item>
</style>
<style name="Button.Secondary" parent="Button">
    <item name="android:background">@drawable/secondary_button_state</item>
    <item name="android:textColor">@color/blue</item>
</style>
<style name="Button.Secondary.Large" parent="Button.Secondary">
    <item name="android:drawableEnd">@drawable/ic_chevron</item>
    <item name="android:drawableTint">?colorPrimary</item>
    <item name="android:gravity">center|start</item>
</style>

И я использую его в представлении

<androidx.appcompat.widget.AppCompatButton
   android:id="@+id/action_date_range"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   style="@style/Button.Secondary.Large"
   android:text="@{viewModel.overrideDateRange}"
   tools:text="@string/override_date_range" />

У меня проблема в том, чтос <item name="android:drawableEnd">@drawable/ic_chevron</item>.Этот нарисованный объект не отображается в API 23 и ниже, API 24 и выше, он в порядке.

РЕДАКТИРОВАТЬ:

Это мой нарисованный ресурс

<vector xmlns:android="http://schemas.android.com/apk/res/android"
  android:width="24dp"
  android:height="24dp"
  android:viewportWidth="24"
  android:viewportHeight="24">

  <path
    android:pathData="M7,19.4099l1.5443,1.5901l8.7414,-8.9993l-8.7414,-9.0007l-1.5443,1.5916l7.1956,7.4271z"
    android:strokeWidth="1"
    android:fillColor="#FFFFFF"
    android:fillType="evenOdd"
    android:strokeColor="#00000000" />

</vector>

1 Ответ

0 голосов
/ 28 ноября 2018

Это похоже на ошибку (я сталкивался с ней в эмуляторах и устройствах под управлением Android 6): отрисовка отрисовывается, но атрибут стиля <item name="android:drawableTint">?colorPrimary</item> не имеет никакого эффекта, поэтому отрисовка белая.

Вы можете проверить это, изменив android:fillColor="#FFFFFF" на android:fillColor="#000000" в пути прорисовываемого вектора.

Так что вам придется программно установить цвет для более низких уровней Api:

Для Android 6 вы можете ввести файл цветовых ресурсов res / color / my_button_tint.xml , определяющий ColorStateList.Поскольку вам нужен только один цвет, достаточно одного элемента в структуре селектора.Но у вас может быть больше цветов в зависимости от состояния Button

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

Теперь вы можете написать

if(Build.VERSION.SDK_INT == Build.VERSION_CODES.M){
    Context ctx = myButton.getContext(); // use any available Context here
    ColorStateList csl = ContextCompat.getColorStateList(ctx, R.color.my_button_tint);
    myButton.setCompoundDrawableTintList(csl);
}

Для более низких уровней API вы можете изменитьцвет Drawable, применив ColorFilter, см., например, этот пост

Или просто измените android:fillColor="#ffffff" на пути вектора, который можно нарисовать, до желаемого цвета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...