Не удается отобразить MaterialButton с помощью android.material: 1.1.x

Всякий раз, когда я использую 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 Все еще не повезло с последней версией A.S. 3.4.1!


person RJFares    schedule 22.04.2019    source источник
comment
Вы установили тему своего приложения для расширения от Theme.MaterialComponent или его подкласса?   -  person karan    schedule 22.04.2019
comment
Эта проблема сохраняется и в alpha06, и в Studio 3.5beta1.   -  person amitavk    schedule 13.05.2019


Ответы (5)


Обновление 3. Наконец-то это исправлено в Студия 3.5beta2! Мы сделали это, ребята! ????

Update2: я зарегистрировал проблему здесь: 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 следующим образом:

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

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

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

person amitavk    schedule 27.04.2019
comment
Это сработало для меня! Проблема, кажется, в свойствах высоты. - person Robin Hood; 01.05.2019
comment
Также исправлена ​​3.5 Beta3 :) - person abalta; 03.06.2019
comment
Это не сработает, если вы переформатируете свой код внутри файла xml. Этот ответ необходимо отредактировать и дать более полное решение. - person blueware; 13.06.2019
comment
Кажется, снова произошел сбой в бета-версии 4 - person Morten Holmgaard; 19.06.2019
comment
Я сталкиваюсь с той же проблемой на A.S. 3.4.2, Это сводит меня с ума уже несколько дней, Сейчас скачиваю A.S. 3.6 Canary 3. Надеюсь, что проблема там решена. Дам отзыв, когда закончу тестирование - person Doilio Matsinhe; 21.07.2019

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

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

person Gautham Sajith    schedule 23.04.2019
comment
Думаю, я сделаю это, когда вернусь из отпуска, и обновлю эту тему, когда получу дополнительную информацию. На данный момент я просто использую пространство имен инструментов, чтобы установить стиль как неповышенный - person RJFares; 23.04.2019
comment
Могу подтвердить, у меня тоже работает кнопка без повышений. - person amitavk; 27.04.2019
comment
Я сделал отчет здесь: issuetracker.google.com/issues/132562197. - person amitavk; 13.05.2019

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

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

attrs.xml

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

стили.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>
person ievgen    schedule 02.05.2019
comment
Круто, а если я захочу настроить свой Theme.Button? - person blueware; 13.06.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>
person android    schedule 22.04.2019
comment
У меня такая же проблема и тема тут ни при чем (у меня уже есть MaterialComponents один) - person Mykhailo Gaidai; 22.04.2019
comment
я обновил свою студию Android с 3.3.2 до 3.4, и после создания нового проекта у меня возникла та же проблема, когда я беру кнопку материала со стилем @style/Widget.MaterialComponents.Button, и когда я обновляю свою тему, она успешно работает - person android; 23.04.2019
comment
Это уже было сделано, я добавил редактирование 2 в вопрос, чтобы уточнить - person RJFares; 23.04.2019

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

Он отлично работает на A.S. 3.6 Canary 3... Я использую API 29 и material_version = '1.1.0-alpha08'

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

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

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

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

Ваше здоровье.

person Doilio Matsinhe    schedule 21.07.2019