MaterialCardView在使用material:1.1.0时出现崩溃问题。

41

我正在使用MaterialCardView作为我的cardview布局。现在,Android-studio开始显示我应该更新到1.1.0,而不是当前的implementation "com.google.android.material:material:1.0.0"

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/edit_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:orientation="vertical"
    android:layout_margin="@dimen/activity_vertical_margin">

  <com.google.android.material.card.MaterialCardView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:cardCornerRadius="8dp"
      app:cardElevation="8dp">

      <...more layout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>

使用 1.1.0 版本时,我遇到了崩溃 Error inflating class com.google.android.material.card.MaterialCardView

因此,我有以下三种情况:

  1. 坚持使用 1.0.0 并使用 MaterialCardView (可以工作,但不是首选)
  2. 升级到 1.1.0(或1.2.0-alpha)并使用 androidx.CardView(可以工作,但不是首选)
  3. 升级到 1.1.0 并更改 MaterialCardView首选,但无法工作

由于我想选择第三个选项,但是我没有任何解决方法。有人能给个提示吗?

更新 我的样式(我有 style 和 style-night。这里只发布 style):

<resources>

  <!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.AppCompat.DayNight">
    <!-- 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.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
  </style>

  <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

  <style name="ThemeOverlay.AppCompat.navTheme">
    <!-- Color of text and icon when SELECTED -->
    <item name="colorPrimary">#ffffff</item>
    <!-- Background color when SELECTED -->
    <item name="colorControlHighlight">@color/colorPrimary</item>

  </style>

</resources>

这里是来自Logcat的错误信息:

2020-02-12 13:34:18.171 12562-12562/com.example.phocast E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.phocast, PID: 12562
    android.view.InflateException: Binary XML file line #10 in com.example.phocast:layout/fragment_place: Binary XML file line #10 in com.example.phocast:layout/fragment_place: Error inflating class com.google.android.material.card.MaterialCardView
    Caused by: android.view.InflateException: Binary XML file line #10 in com.example.phocast:layout/fragment_place: Error inflating class com.google.android.material.card.MaterialCardView
    Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at android.view.LayoutInflater.createView(LayoutInflater.java:854)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1123)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:682)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:534)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:481)
        at com.example.phocast.MainActivity.onOptionsItemSelected(MainActivity.java:555)
        at android.app.Activity.onMenuItemSelected(Activity.java:4137)
        at androidx.fragment.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:383)
        at androidx.appcompat.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:219)
        at androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109)
        at androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109)
        at androidx.appcompat.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:64)
        at androidx.appcompat.widget.Toolbar$1.onMenuItemClick(Toolbar.java:207)
        at androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:781)
        at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)
        at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
        at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
        at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:981)
        at androidx.appcompat.widget.ActionMenuView.invokeItem(ActionMenuView.java:625)
        at androidx.appcompat.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:151)
        at android.view.View.performClick(View.java:7125)
        at android.view.View.performClickInternal(View.java:7102)
        at android.view.View.access$3500(View.java:801)
        at android.view.View$PerformClick.run(View.java:27336)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant).
        at com.google.android.material.internal.ThemeEnforcement.checkTheme(ThemeEnforcement.java:248)
        at com.google.android.material.internal.ThemeEnforcement.checkMaterialTheme(ThemeEnforcement.java:222)
        at com.google.android.material.internal.ThemeEnforcement.checkCompatibleTheme(ThemeEnforcement.java:150)
        at com.google.android.material.internal.ThemeEnforcement.obtainStyledAttributes(ThemeEnforcement.java:81)
        at com.google.android.material.card.MaterialCardView.<init>(MaterialCardView.java:124)
        at com.google.android.material.card.MaterialCardView.<init>(MaterialCardView.java:114)
        at java.lang.reflect.Constructor.newInstance0(Native Method) 
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343) 
        at android.view.LayoutInflater.createView(LayoutInflater.java:854) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:1123) 
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:682) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:534) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:481) 
        at com.example.phocast.MainActivity.onOptionsItemSelected(MainActivity.java:555) 
        at android.app.Activity.onMenuItemSelected(Activity.java:4137) 
        at androidx.fragment.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:383) 
        at androidx.appcompat.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:219) 
        at androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109) 
        at androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:109) 
        at androidx.appcompat.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:64) 
        at androidx.appcompat.widget.Toolbar$1.onMenuItemClick(Toolbar.java:207) 
        at androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:781) 
        at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840) 
        at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158) 
        at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991) 
        at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:981) 
        at androidx.appcompat.widget.ActionMenuView.invokeItem(ActionMenuView.java:625) 
        at androidx.appcompat.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:151) 
        at android.view.View.performClick(View.java:7125) 
        at android.view.View.performClickInternal(View.java:7102) 
        at android.view.View.access$3500(View.java:801) 
        at android.view.View$PerformClick.run(View.java:27336) 
        at android.os.Handler.handleCallback(Handler.java:883) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:9302020-02-12 13:34:18.620 12562-12584/com.example.phocast I/example.phocas: Background young concurrent copying GC freed 110384(4259KB) AllocSpace objects, 46(1212KB) LOS objects, 41% free, 7792KB/12MB, paused 1.092ms total 150.548ms
2020-02-12 13:34:18.692 12562-12562/com.example.phocast I/Process: Sending signal. PID: 12562 SIG: 9

你好,感谢您的快速回复。错误日志并不是很有帮助,因为它只是说无法解压二进制 XML 文件。 - BaRud
那你能添加完整的 XML 吗? - Md. Asaduzzaman
请在以下网址中发布您的完整XML文件和Build.gradle文件:https://paste.ofcode.org/ - InsaneCat
1
尝试在com.google.android.material.card.MaterialCardView的XML中添加并检查android:theme="@style/Theme.MaterialComponents.Light",请参考https://www.material.io/develop/android/docs/getting-started/和https://dev59.com/ulQK5IYBdhLWcg3wbfSW#52314889。 - InsaneCat
请发布您的应用程序主题和完整的堆栈跟踪。 - Gabriele Mariotti
显示剩余3条评论
11个回答

73

你可以将它直接保留在你的MaterialCardView中:

 <com.google.android.material.card.MaterialCardView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:cardCornerRadius="8dp"
     **** android:theme="@style/Theme.MaterialComponents.Light"  *****
      app:cardElevation="8dp">

1
或者您可以按照DeepLathia的答案中建议的方法为正在创建新应用程序的人使用所需的解决方案。 - Machado

28

错误在堆栈跟踪中:

Caused by: java.lang.IllegalArgumentException: 此组件的样式要求您的应用程序主题是Theme.MaterialComponents(或其后代)。

使用版本1.1.0时,您必须继承自Theme.MaterialComponents

将您的应用程序主题更改为

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
  <!-- ....  -->
</style>

谢谢。这个程序可以运行,除了一个问题:tablayout的活动字体颜色已经改变了(从白色变成紫色),我猜这是从AppCompat到MaterialsTheme的过渡造成的副作用。我没有明确设置那个字体颜色。鉴于这已经超出了当前问题的范围,我将创建一个新的问题。你介意我在这里标记一下吗? - BaRud
@BaRud。谢谢,没问题。 - Gabriele Mariotti

15

你需要将AppTheme更改为其父主题是MaterialComponent的后代。

在你的情况下,将AppTheme从

  <style name="AppTheme" parent="Theme.AppCompat.DayNight">
  <style name="AppTheme" parent="Theme.MaterialComponents.DayNight">

应该修复这个问题。


没错!忘了更改新应用程序的主题) 谢谢 - StayCool
将MaterialComponents添加到应用程序主题中解决了我的错误,谢谢! - Elkes

11

在我的情况下,我只需添加 android:theme="" 属性即可使它正常工作。我的 Material Card View 元素如下所示 -

<com.google.android.material.card.MaterialCardView
            android:id="@+id/edit_profile_card"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginStart="@dimen/dp_16"
            android:layout_marginTop="@dimen/dp_10"
            android:layout_marginEnd="@dimen/dp_16"
            android:layout_marginBottom="@dimen/dp_10"
            **android:theme="@style/Theme.MaterialComponents.DayNight"**
            app:cardCornerRadius="@dimen/dp_10"
            app:cardElevation="@dimen/dp_20"
            app:state_dragged="false">

           ....
           ....

        </com.google.android.material.card.MaterialCardView>

2

尝试最新版本

implementation 'com.google.android.material:material:1.2.0-alpha03'

style.xml:

<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>

在您的XML中:

<com.google.android.material.card.MaterialCardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

</com.google.android.material.card.MaterialCardView>

1

只需在style.xml中将主题更改为:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">

它就能正常工作了。


1
在将 <style name="AppTheme" parent="Theme.AppCompat.DayNight> 更改为 <style name="AppTheme" parent="Theme.MaterialComponents.DayNight"> 后,它可以正常工作。

0

如果您想保留应用程序的先前主题(AppCompat),则可以使用桥接主题。它们在此处中进行了描述。

来自文档:

桥接主题继承自AppCompat主题,但也为您定义了新的Material Components主题属性。如果您使用桥接主题,则可以开始使用Material Design组件,而无需更改应用程序主题。

例如,在res/values/themes.xml中:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.Bridge">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
</style>

0

我在最新的Material Design版本中遇到了这个错误。我只是在资源文件中删除了不合适的颜色(app:strokeColor="?attr/colorSurfaceVariant"),然后它就可以工作了。


0
如果在styles.xml中将主题更改为Theme.MaterialComponents后仍然无效,则请确保您已经在MaterialCard中添加了style标签。
style="@style/Widget.MaterialComponents.CardView"

我尝试了你的答案,但仍然遇到相同的错误。是否有其他解决方案? - sanoj lawrence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接