无法使用android.material:1.1.x渲染MaterialButton

时间:2019-04-22 09:07:40

标签: android android-studio material-components-android

每当我使用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!

5 个答案:

答案 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。

做最适合您需求的事情。

干杯。