Добавление нескольких LayerList в API 19 Устройство вызывает ошибку надувания - PullRequest
5 голосов
/ 15 марта 2020

Я пытаюсь создать кнопку с двумя фонами, мой собственный фон

android:background="@drawable/background_profile_edit_button" + ?attr/selectableItemBackground```

Полная кнопка:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@+id/fragprofile_constraint"
    app:layout_constraintRight_toRightOf="parent"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="16dp"
    android:background="@drawable/background_profile_edit_button"
    android:paddingStart="32dp"
    android:paddingTop="6dp"
    android:paddingEnd="32dp"
    android:paddingBottom="6dp"
    android:text="Edit Profile"
    android:textColor="@color/colorBlackFont"
    android:textSize="12sp"
    android:textStyle="bold"/>

Это можно легко исправить с помощью android:foreground="?attr/selectableItemBackground", однако это требует api 23 и мой минимум 19.

Я также попробовал другой подход, используя layer-list в моем рисовании:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape
            android:shape="rectangle">
            <solid android:color="@color/colorWhite" />

            <stroke
                android:width="1dp"
                android:color="@color/dividerColor" />
            <corners android:radius="3dp"/>
        </shape>
    </item>

    <item
        android:drawable="?attr/selectableItemBackground">
    </item>


</layer-list>

Этот список слоев отлично работает на моих устройствах с более высоким API. Однако это вызывает взлом sh на моем устройстве API 19 ...

android.view.InflateException: Binary XML file line #201: Error inflating class TextView

У этого человека также была такая же проблема, и он также остался без ответа:

Ошибка API 19 LayerList: для тега требуется атрибут drawable или дочерний тег, определяющий drawable

TLDR: _______________________________________________________

enter image description here

Выполнение этого на устройстве API 19

Ответы [ 4 ]

1 голос
/ 19 марта 2020

Вы пытались ссылаться на drawable непосредственно в вашем списке слоев вместо ссылки на атрибут stylelable (после ответа @ tynn)? это сработало? или есть причина, почему это не будет работать для вас?

Если список слоев работает на всех API, кроме 19, есть один обходной путь / компромисс, который я мог бы предложить. оставьте текущий список слоев, как он есть в папке drawable, а также в drawable-v21 (вам может понадобиться создать эту папку), а затем создайте альтернативный дизайн кнопки, работающий на API19, и сохраните его в drawable-v19, возможно, в вашем приложении. будет выглядеть не так хорошо в API19, но, по крайней мере, он все равно будет работать без ошибок на всех устройствах.

это работает, сообщая android, что он должен использовать другой извлекаемый ресурс всякий раз, когда он встречает API19, вы можете прочитать об этом больше здесь . android автоматически возьмет свой ресурс из папки dawable-vXX, ближайшей к его API, и вернется в папку drawable, если не сможет найти ресурс в этой папке drawable-vXX.

Существует также эта статья , которую я нашел у кого-то, кто тоже был одержим этим. очевидно, вы можете попробовать заменить текстовое представление на кнопку и добиться эффекта ряби, используя AppTheme

<!-- styles.xml -->
<style name="AppTheme.YellowButton">
    <item name="colorButtonNormal">@color/yellow</item>
</style>

<!-- layout.xml -->
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.YellowButton"
android:text="Yellow Tint Button" />

, дайте мне знать, если он работает

1 голос
/ 19 марта 2020

Сейчас я просто использую RelativeLayout в качестве оболочки для кнопки. Если у кого-то есть решение без NestedLayout Hacky Solution, это было бы замечательно.


<RelativeLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/fragprofile_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/background_profile_edit_button">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="?attr/selectableItemBackground"/>
    </RelativeLayout>

</RelativeLayout>

Правка. Проблема с этой проблемой заключается в том, что android:background="@drawable/background_profile_edit_button" на Относительном макете приводит к тому, что угловой радиус не работает ... на устройствах менее API 21 ...

{ ссылка }

1 голос
/ 18 марта 2020

Context.getDrawable(Theme) и Resources.getDrawable(int,Theme) были оба введены в Android SDK level 21. До того, как тематические атрибуты не поддерживались в доступных для рисования ресурсах. Theme

не было доступно *1007* доступных для загрузки атрибутов. В блоге Стили цветов и рисования с атрибутами темы Алекса Локвуда это объясняется еще лучше.

0 голосов
/ 24 марта 2020

Вы можете сделать это в коде. Попробуйте код ниже:

// rect.xml file in drawables
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@android:color/white" />

    <stroke
        android:width="1dp"
        android:color="@android:color/holo_green_light" />
    <corners android:radius="3dp" />
</shape>


fun getLayer(id: Int) = if (android.os.Build.VERSION.SDK_INT < 21) resources.getDrawable(id)
else resources.getDrawable(id, theme)

// Get first shape layer
val layer1 = getLayer(R.drawable.rect)

// Get second layer from  attributes
val a = theme.obtainStyledAttributes(
    R.style.AppTheme,
    intArrayOf(android.R.attr.selectableItemBackground)
)
val attributeResourceId = a.getResourceId(0, 0)
val layer2 = getLayer(attributeResourceId)

// Create layer list
val layers = LayerDrawable(arrayOf(layer1, layer2))

button.background = layers
...