Невозможно отобразить MaterialButton с помощью android.material: 1.1.x - PullRequest
18 голосов
/ 22 апреля 2019

Всякий раз, когда я использую MaterialButton, я получаю следующее исключение в предварительном просмотре xml:

java.lang.IllegalArgumentException: java.lang.ClassCastException

Я обновился до Android Studio 3.4 и до com.google.android.material: material: 1.1.0-alpha05

Версия 1.0.0 работает, но любой 1.1.x не работает.

Это проблема с IDE или библиотекой?

-

Для справки: полная трассировка стека:

java.lang.ClassCastException@d8dc5d1
    at sun.reflect.GeneratedMethodAccessor893.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at android.animation.PropertyValuesHolder_Delegate.callMethod(PropertyValuesHolder_Delegate.java:108)
    at android.animation.PropertyValuesHolder_Delegate.nCallFloatMethod(PropertyValuesHolder_Delegate.java:143)
    at android.animation.PropertyValuesHolder.nCallFloatMethod(PropertyValuesHolder.java)
    at android.animation.PropertyValuesHolder.access$400(PropertyValuesHolder.java:38)
    at android.animation.PropertyValuesHolder$FloatPropertyValuesHolder.setAnimatedValue(PropertyValuesHolder.java:1387)
    at android.animation.ObjectAnimator.animateValue(ObjectAnimator.java:990)
    at android.animation.ValueAnimator.animateBasedOnTime(ValueAnimator.java:1339)
    at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1471)
    at android.animation.ValueAnimator.pulseAnimationFrame(ValueAnimator.java:1490)
    at android.animation.AnimatorSet.pulseFrame(AnimatorSet.java:1163)
    at android.animation.AnimatorSet.handleAnimationEvents(AnimatorSet.java:1146)
    at android.animation.AnimatorSet.doAnimationFrame(AnimatorSet.java:1046)
    at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:146)
    at android.animation.AnimationHandler.access$100(AnimationHandler.java:37)
    at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:54)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:947)
    at android.view.Choreographer.doCallbacks(Choreographer.java:761)
    at android.view.Choreographer_Delegate.doFrame(Choreographer_Delegate.java:66)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.renderAndBuildResult(RenderSessionImpl.java:563)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.render(RenderSessionImpl.java:425)
    at com.android.layoutlib.bridge.BridgeRenderSession.render(BridgeRenderSession.java:120)
    at com.android.ide.common.rendering.api.RenderSession.render(RenderSession.java:151)
    at com.android.ide.common.rendering.api.RenderSession.render(RenderSession.java:133)
    at com.android.tools.idea.rendering.RenderTask.lambda$null$8(RenderTask.java:755)
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

РЕДАКТИРОВАТЬ Это происходит только в том случае, если стиль кнопки не установлен ИЛИ по умолчанию:

@style/Widget.MaterialComponents.Button

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

Редактировать 2 родитель темы приложения уже правильно установлен как Theme.AppCompat.Light.DarkActionBar.Это проблема IDE, так как она хорошо работает на моем эмуляторе и устройстве.Я также сделал очистку кэша и аннулирование, чистую сборку, перестройку ... (стандартные вещи, которые мы делаем, когда сталкиваемся со странными проблемами IDE)

Редактировать 3 Все еще не повезло с последнейAS 3.4.1!

Ответы [ 5 ]

18 голосов
/ 27 апреля 2019

Обновление3 : Это наконец исправлено в Studio 3.5beta2 ! Мы сделали это, ребята! ?

Обновление2 : Я отправил сообщение о проблеме здесь: https://issuetracker.google.com/issues/132562197. Пожалуйста, пометьте звездочкой для наглядности.

Обновление : Этот является более обходным решением, поскольку нам не нужно мусорить tools:style во всех наших макетах XML. Это перестало работать для меня без видимой причины мне пришлось вернуться к исходному решению, описанному ниже.


Вот обходной путь, пока мы не получим реальное исправление, основанное на открытии Гаутама:

Добавьте этот стиль к вашему styles.xml:

<!--  For the sake of xml preview not breaking  -->
    <style name="UnelevatedButton" parent="Widget.MaterialComponents.Button.UnelevatedButton">
    </style>

Добавьте его к своим Button s так:

<Button
        ...
        tools:style="@style/UnelevatedButton"
        style="@style/ActualButtonStyle"
        />

Обратите внимание, что порядок этих двух элементов важен, строка tools должна идти первой.

Вы можете обновить UnelevatedButton, чтобы он соответствовал вашему ActualButtonStyle, чтобы обеспечить предварительный просмотр в соответствии с фактическими кнопками времени выполнения.

4 голосов
/ 02 мая 2019

Решение amitav13 имеет одну серьезную проблему: когда вы переформатируете код, правила по умолчанию переставят все атрибуты, а затем все снова сломается.

Вместо этого, пока это не исправлено, мое предложениеявляется создание отдельной темы приложения для использования в окнах предварительного просмотра, в этом примере эта тема называется AppTheme.PreviewFix .Просто выберите эту тему в области предварительного просмотра / дизайна.

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <attr name="buttonStyle" format="reference" />
</resources>

styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="Theme.MaterialComponents">
        <item name="colorPrimary">@color/primaryColor</item>
        <item name="colorPrimaryDark">@color/primaryDarkColor</item>
        <item name="colorSecondary">@color/secondaryColor</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="buttonStyle">@style/AppTheme.Button</item>
    </style>

    <style name="AppTheme.PreviewFix" parent="AppTheme">
        <item name="buttonStyle">@style/AppTheme.Button.PreviewFix</item>
    </style>

    <style name="AppTheme.Button" parent="Widget.MaterialComponents.Button"/>

    <style name="AppTheme.Button.PreviewFix" parent="Widget.MaterialComponents.Button.UnelevatedButton"/>
</resources>

my_layout.xml

<com.google.android.material.button.MaterialButton
        style="?buttonStyle"
        ...
</com.google.android.material.button.MaterialButton>
4 голосов
/ 23 апреля 2019

Я сейчас пытаюсь воспроизвести эту проблему, но мне нужно больше информации. Моя текущая гипотеза заключается в том, что это связано с возвышением кнопок (на основе вызовов анимации в трассировке стека), поэтому и нелицензированная кнопка работает должным образом.

Не могли бы вы подать проблему на https://issuetracker.google.com/issues/new?component=439535&template=1121918 с названием и описанием компонента, а также с запрашиваемой информацией?

1 голос
/ 22 апреля 2019

Установите тему приложения из AppCompat в MaterialComponents, например ниже:

Используйте стиль ниже:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

вместо

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
0 голосов
/ 21 июля 2019

У меня была та же проблема, я скачал другую версию Android Studio.

На AS 3.6 Canary 3 работает нормально ... Я использую API 29, а material_version = '1.1.0-alpha08 '

Загрузите его здесь

Последняя рабочая версия для моей более ранней версии Android Studio была material_version =' 1.0.0 '.

Но этоУ меня не было некоторых новых функций компонентов материала, поэтому вместо отката я решил обновить Android Studio.

Делать то, что лучше всего соответствует вашим потребностям.

Приветствия.

...