Невозможно отобразить MaterialButton с помощью android.material: 1.1.x
Всякий раз, когда я использую MaterialButton, я получаю следующее исключение в предварительном просмотре xml:
java.lang.IllegalArgumentException: java.lang.ClassCastException
Я обновился до Android Studio 3.4 и до com.google.android.material: материал: 1.1.0-alpha05
Версия 1.0.0 работает, но любая 1.1.x не работает.
Это проблема с IDE или библиотекой?
-
Для справки: полная трассировка стека:
[email protected]
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)
РЕДАКТИРОВАТЬ Это происходит только тогда, когда стиль кнопки не установлен ИЛИ по умолчанию:
@Стиль/Widget.MaterialComponents.Button
Например, установка стиля без выравнивания работает, поэтому в качестве обходного пути я использую пространство имен инструментов, чтобы показать стиль кнопки без выравнивания.
Отредактируйте 2, родительский объект темы приложения уже правильно установлен как Theme.AppCompat.Light.DarkActionBar. Это проблема IDE, так как она хорошо работает на моем эмуляторе и устройстве. Я также сделал очистку кэша и аннулирование, чистую сборку, перестройку... (стандартные вещи, которые мы делаем, когда сталкиваемся со странными проблемами IDE)
Edit 3 Все еще не повезло с последней версией AS 3.4.1!
Ответы
Ответ 1
Обновление 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
следующим образом:
<Button
...
tools:style="@style/UnelevatedButton"
style="@style/ActualButtonStyle"
/>
Обратите внимание, что порядок этих двух элементов важен, линия tools
должна стоять на первом месте.
Вы можете обновить UnelevatedButton
чтобы он соответствовал вашему ActualButtonStyle
чтобы предварительный просмотр соответствовал вашим фактическим кнопкам времени выполнения.
Ответ 2
Я пытаюсь воспроизвести эту проблему в настоящее время, но мне нужно больше информации. Моя текущая гипотеза заключается в том, что это связано с возвышением кнопок (на основе вызовов анимации в трассировке стека), поэтому также ненагруженная кнопка работает должным образом.
Не могли бы вы подать проблему по адресу https://issuetracker.google.com/issues/new?component=439535&template=1121918, указав название и описание компонента, а также запрошенную там информацию?
Ответ 3
Решение 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
Установите тему приложения из 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>
Ответ 5
У меня была такая же проблема, я скачал другую версию Android Studio.
На AS 3.6 Canary 3 работает нормально... Я использую API 29, а material_version = '1.1.0-alpha08'
Загрузите это здесь
Последняя рабочая версия для моей более ранней Android Studio была material_version = '1.0.0'.
Но у него не было некоторых новых компонентов компонентов материала, поэтому вместо отката я решил обновить Android Studio.
Делайте то, что лучше всего соответствует вашим потребностям.
Приветствия.