每当我使用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!
答案 0 :(得分:10)
Update3 :此问题最终在Studio 3.5beta2中得到了解决!我们做到了!
Update2 :我在这里提出了一个问题:https://issuetracker.google.com/issues/132562197。请注视以提高知名度。
更新:This是一种更清洁的解决方法,因为我们不必在整个xml布局中乱扔这已停止工作对我来说,没有明显的原因,我不得不恢复到下面描述的原始解决方法。tools:style
。
在根据Gautham的发现获得实际修复之前,这里是一种变通方法:
将此样式添加到您的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
相匹配。
答案 1 :(得分:4)
我目前正在尝试重现此问题,但我需要更多信息。我目前的假设是,它与按钮的高度有关(基于stacktrace中的动画调用),这也是为什么未升高的按钮可以按预期工作的原因。
能否请您在https://issuetracker.google.com/issues/new?component=439535&template=1121918处发布组件名称和描述以及此处要求的信息的问题?
答案 2 :(得分:4)
amitav13's solution有一个主要问题,当您重新格式化代码时,默认规则将重新排列所有属性,然后所有内容再次中断。
相反,在解决此问题之前,我的建议是创建一个单独的应用程序主题以供在预览窗口中使用,在本示例中,此主题称为 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>
答案 3 :(得分:1)
将您的应用程序主题从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>
答案 4 :(得分:0)
我遇到了同样的问题,我已经下载了另一个版本的Android Studio。
在A.S.上运行正常3.6金丝雀3 ... 我正在使用API 29,并且material_version ='1.1.0-alpha08'
下载here
我以前的Android Studio的最后一个工作版本是material_version ='1.0.0'。
但是它没有某些新的材质组件功能,因此我没有回滚,而是决定更新Android Studio。
做最适合您需求的事情。
干杯。