花了一整天试图弄清楚这一点之后,我几乎可以肯定是在材料零件库中的缺陷。这里是(去除不相关的元素)我的配置的相关部分:
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检查),并再次失败(我在我的应用程序定义的主题是也。)
我会继续和文件中的错误,如果任何人有解决方案或任何建议,这将是非常感谢!
为了跟进评论:您使用一个已经从使用正确的主题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();
// ...
}