これを理解するために丸一日を費やした後、私はそれがマテリアル コンポーネント ライブラリのバグであるとほぼ確信しています。これが私の構成の関連部分です(無関係な要素を削除しました):
スタイル.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 をチェックします)、もう一度失敗します(アプリのテーマでも定義しています。)
先に進んでバグを報告します。誰かが解決策や提案を持っている場合は、非常に感謝しています!