简体   繁体   English

在棉花糖(6.0+)设备上的onCreateViewHolder方法中夸大RecyclerView项的布局时引发“ android.view.InflateException”

[英]“android.view.InflateException” being thrown on inflating RecyclerView item's layout in onCreateViewHolder method on Marshmallow(6.0+) devices

I have created an app with RecyclerView using v7:28.0.0 support libraries and app runs fine on Android 8.0+ devices when testing. 我已经使用v7:28.0.0支持库使用RecyclerView创建了一个应用,并且在测试时该应用在Android 8.0+设备上运行良好。 But when using Android 6.0/6.0.1 devices, app crashed with: 但是,当使用Android 6.0 / 6.0.1设备时,应用崩溃并出现以下情况:

E/AndroidRuntime: FATAL EXCEPTION: main

android.view.InflateException: Binary XML file line #38: Binary XML file line #38: Error inflating class <unknown>

Gradle file: 摇篮文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.toastinterceptor"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner 
"androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0-alpha05'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta1'
    implementation 'com.google.android.material:material:1.1.0-alpha06'
    testImplementation 'junit:junit:4.13-beta-3'
    androidTestImplementation 'androidx.test:runner:1.2.0-beta01'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-beta01'

//    support dependencies
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'

//    Room dependencies
    def room_version = "2.1.0-beta01"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
    testImplementation "androidx.room:room-testing:$room_version"

//    support design dependencies
    implementation "com.android.support:design:28.0.0"
    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
}

activity_main: activity_main:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical">

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:listitem="@layout/rv_list"
    android:scrollbars="vertical"
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
    />

<TextView
    android:id="@+id/empty_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:visibility="gone"
    android:text="@string/nothing_to_show" />

rv_list: rv_list:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@drawable/border"
android:orientation="vertical"
android:padding="5dp">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/tv_date"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.8"
        android:gravity="center_vertical"
        android:hint="@string/event_time"
        android:textSize="15sp" />

    <ImageView
        android:id="@+id/iv_options"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.1"
        android:contentDescription="@string/options_icon"
        android:src="@drawable/ic_garbage" />
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="65dp"
        android:layout_height="65dp"
        android:contentDescription="@string/app_icon"
        android:src="@drawable/ic_launcher_foreground" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@drawable/divider_horizontal"
        android:orientation="vertical"
        android:showDividers="middle"
        android:padding="5dp">

        <TextView
            android:id="@+id/tv_pkgName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/package_name"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:textSize="15sp" />

        <TextView
            android:id="@+id/tv_msg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/toast_content"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:textSize="15sp" />
    </LinearLayout>
</LinearLayout>

styles: 样式:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.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>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">true</item>
    <item name="windowNoTitle">false</item>
</style>

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

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

RecyclerView.Adapter class: RecyclerView.Adapter类:

public class ToastListAdapter extends RecyclerView.Adapter<ToastListAdapter.ToastViewHolder> {

private Context context;
private LayoutInflater inflater;
private List<ToastEntity> toasts = Collections.emptyList();
private ToastRepository toastRepository;

ToastListAdapter(Application application) {
    this.context = application.getApplicationContext();
    inflater = LayoutInflater.from(context);
    toastRepository = new ToastRepository(application);
}

void setToasts(List<ToastEntity> toasts) {
    this.toasts = toasts;
    notifyDataSetChanged();
}


@NonNull
@Override
public ToastViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.rv_list, parent, false);
    return new ToastViewHolder(view);
}
...
...
class ToastViewHolder extends RecyclerView.ViewHolder {
    private TextView tv_date, tv_pkgName, tv_msg;
    private ImageView iv_icon, iv_options;

    ToastViewHolder(@NonNull View itemView) {
        super(itemView);
        tv_date = itemView.findViewById(R.id.tv_date);
        tv_pkgName = itemView.findViewById(R.id.tv_pkgName);
        tv_msg = itemView.findViewById(R.id.tv_msg);
        iv_options = itemView.findViewById(R.id.iv_options);
        iv_icon = itemView.findViewById(R.id.iv_icon);

    }
}
}

debug: 调试:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.toastinterceptor, PID: 7581
android.view.InflateException: Binary XML file line #38: Binary XML file line #38: Error inflating class <unknown>
    at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at com.example.toastinterceptor.ToastListAdapter.onCreateViewHolder(ToastListAdapter.java:46)
    at com.example.toastinterceptor.ToastListAdapter.onCreateViewHolder(ToastListAdapter.java:24)
    at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6949)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6118)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6001)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5997)
    at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2227)
    at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1558)
    at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1518)
    at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:613)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4032)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3749)
    at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4302)
    at android.view.View.layout(View.java:17211)
    at android.view.ViewGroup.layout(ViewGroup.java:5584)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
    at android.view.View.layout(View.java:17211)
    at android.view.ViewGroup.layout(ViewGroup.java:5584)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    at android.view.View.layout(View.java:17211)
    at android.view.ViewGroup.layout(ViewGroup.java:5584)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
    at android.view.View.layout(View.java:17211)
    at android.view.ViewGroup.layout(ViewGroup.java:5584)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    at android.view.View.layout(View.java:17211)
    at android.view.ViewGroup.layout(ViewGroup.java:5584)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:2001)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1844)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1753)
    at android.view.View.layout(View.java:17211)
    at android.view.ViewGroup.layout(ViewGroup.java:5584)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:396)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
    at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2763)
    at android.view.View.layout(View.java:17211)
    at android.view.ViewGroup.layout(ViewGroup.java:5584)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2640)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2285)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1343)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6826)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:901)
    at android.view.Choreographer.doCallbacks(Choreographer.java:703)
    at android.view.Choreographer.doFrame(Choreographer.java:638)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:887)
    at android.os.Handler.handleCallback(Handler.java:815)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Loope
Application terminated.

How can make the app run on Android versions starting from 6.0? 如何使该应用程序在6.0以上的Android版本上运行? Does the support library work on Android versions starting from 6.0? 支持库是否适用于从6.0开始的Android版本? Can I use multiple versions of support libraries or do I have to remove components like RecyclerView altogether for lower Android versions. 我可以使用多个版本的支持库,还是必须完全删除RecyclerView之类的组件才能获得较低的Android版本。 Please assist. 请协助。

The error is complaining about line 38 of rv_list . 错误rv_list第38 rv_list That is: 那是:

android:src="@drawable/ic_launcher_foreground"

In a typical Android Studio project, ic_launcher_foreground is defined in res/drawable-v24/ . 在典型的Android Studio项目中, ic_launcher_foreground是在res/drawable-v24/ ic_launcher_foreground res/drawable-v24/定义的。 This says "only use this resource on API Level 24 and higher devices". 这表示“仅在API级别24和更高的设备上使用此资源”。 So, unless you have done something to create another version of this resource that works on older devices, you cannot inflate your layout on Android 6.0 (API Level 23) and below. 因此,除非您已完成创建可在较旧设备上运行的该资源的另一个版本的操作,否则您将无法在Android 6.0(API级别23)及以下版本上扩展布局。

You need that android:src attribute to point to a drawable resource that you have on all versions of Android. 您需要android:src属性指向所有版本的Android上都具有的可绘制资源。 Or, if you plan to fill in the ImageView at runtime, remove android:src from the layout. 或者,如果您打算在运行时填充ImageView ,请从布局中删除android:src

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 android.view.InflateException:二进制XML文件第0行:膨胀类错误 <unknown> 在下面的API 21的recyclerview中 - android.view.InflateException: Binary XML file line #0: Error inflating class <unknown> in recyclerview for below API 21 原因:android.view.InflateException膨胀Android应用程序中的类时出错 - Caused by: android.view.InflateException Error inflating class in Android app android.view.InflateException:二进制XML文件:错误膨胀类 - android.view.InflateException: Binary XML file: Error inflating class android.view.InflateException夸大类片段的错误 - android.view.InflateException Error inflating class fragment 错误夸大类片段:android.view.InflateException - Error inflating class fragment: android.view.InflateException android.view.InflateException: 充气错误 class<unknown></unknown> - android.view.InflateException: Error inflating class <unknown> 在某些设备中出现错误“ android.view.InflateException:二进制XML文件第2行:二进制XML文件第2行:膨胀类错误 <unknown> ” - Having error in some devices “android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class <unknown>” 我的应用在某些设备上崩溃是由android.view.InflateException引起的二进制XML文件第10行:夸大类ImageView的错误 - My app crashes on some devices error is Caused by android.view.InflateException Binary XML file line #10: Error inflating class ImageView 某些设备的android.view.InflateException(主要是Android 4.4) - android.view.InflateException for some devices (mostly Android 4.4) 动态地将视图或膨胀布局添加到RecyclerView的项目 - Dynamically adding view or inflating layout to RecyclerView's item
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM