偶尔InflateException由于使用MaterialComponents ThemeEnforcement错误。怎么解决?

问题描述 投票:0回答:1

花了一整天试图弄清楚这一点之后,我几乎可以肯定是在材料零件库中的缺陷。这里是(去除不相关的元素)我的配置的相关部分:

styles.xml:

<style name="MaterialAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryVariant">@color/colorPrimary900</item>
    <item name="colorSecondary">@color/colorSecondary</item>
    <item name="colorSecondaryVariant">@color/colorSecondary900</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

AndroidManifest:

<application
    android:name=".AndroidApplication"
    android:theme="@style/MaterialAppTheme">

我的C-TY奇韦:

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:theme="@style/MaterialAppTheme">

依赖版本:

materialComponents: '1.1.0-alpha02',
constraintLayout  : '2.0.0-alpha3',
appCompat         : '1.1.0-alpha01'

我没有问题添加MaterialButton我的登录页面。这些问题在我的MainActivity开始,在我的第一个列表片段。当试图与MaterialCardView作为每个项目的根显示回收站视图中的项目,我得到ThemeEnforcement错误。当我尝试添加MaterialTextButton同去。这里是我的MaterialCardView XML声明如下:

<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
                                               xmlns:card_view="http://schemas.android.com/apk/res-auto"
                                               xmlns:tools="http://schemas.android.com/tools"
                                               android:id="@+id/tripCard"
                                               style="@style/Widget.MaterialComponents.CardView"
                                               android:layout_width="match_parent"
                                               android:layout_height="wrap_content"
                                               android:layout_margin="8dp"
                                               card_view:cardBackgroundColor="@color/colorSurface"
                                               card_view:cardCornerRadius="@dimen/widget_corner_radius"
                                               card_view:cardElevation="@dimen/card_elevation">

当MaterialComponents库中设置断点,我注意到它会失败在某种程度上验证的主题。以下是一些库代码显示出现错误的位置(在ThemeEnforcement.java)的:

    if (enforceMaterialTheme) {
  TypedValue isMaterialTheme = new TypedValue();
  boolean resolvedValue =
      context.getTheme().resolveAttribute(R.attr.isMaterialTheme, isMaterialTheme, true);

  if (!resolvedValue
      || (isMaterialTheme.type == TypedValue.TYPE_INT_BOOLEAN && isMaterialTheme.data == 0)) {
    // If we were unable to resolve isMaterialTheme boolean attribute, or isMaterialTheme is
    // false, check for Material Theme color attributes
    checkMaterialTheme(context);
  }
}

public static void checkMaterialTheme(Context context) {
    checkTheme(context, MATERIAL_CHECK_ATTRS, MATERIAL_THEME_NAME);
}

private static final int[] MATERIAL_CHECK_ATTRS = {R.attr.colorPrimaryVariant};

从我所知道的,主题Enforcer会尝试解决isMaterialTheme属性(它有时可以做的尽管不是在这种情况下),然后它会开始检查材料的主题颜色属性的存在(对colorPrimaryVariant检查),并再次失败(我在我的应用程序定义的主题是也。)

我会继续和文件中的错误,如果任何人有解决方案或任何建议,这将是非常感谢!

android android-theme material-components
1个回答
3
投票

为了跟进评论:您使用一个已经从使用正确的主题LayoutInflater检索的Context是很重要的。应用程序上下文不会满足这个要求。

好消息是,你不必担心注射上下文到您的适配器。这不是显而易见,但该适配器为您提供,以获得正确的上下文中所需要的一切。

看看在onCreateViewHolder()骨架:

@NonNull 
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // ...
}

所有View实例有getContext()方法,以及parent参数是保证非空......所以你可以从父上下文并用它来得到你的LayoutInflater:

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View itemView = inflater.inflate(R.layout.my_item_view, parent, false);
    return new MyViewHolder(itemView);
}

同样,ViewHolder里面,你可以使用同样的技术,以获得上下文对象。每个ViewHolder实例都有所保证为非空,所以你可以检索从上下文中itemView场。

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Context context = holder.itemView.getContext();
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.