1

これを理解するために丸一日を費やした後、私はそれがマテリアル コンポーネント ライブラリのバグであるとほぼ確信しています。これが私の構成の関連部分です(無関係な要素を削除しました):

スタイル.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>

Androidマニフェスト:

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

主な活動:

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

私が知る限り、Theme Enforcer は isMaterialTheme 属性を解決しようとし (この場合は解決できない場合もあります)、マテリアル テーマの色属性の存在をチェックし (colorPrimaryVariant をチェックします)、もう一度失敗します(アプリのテーマでも定義しています。)

先に進んでバグを報告します。誰かが解決策や提案を持っている場合は、非常に感謝しています!

4

1 に答える 1