【问题标题】:android.view.InflateException: Binary XML file line ###: Error inflating class <unknown> in RecyclerViewandroid.view.InflateException: Binary XML file line ###: Error inflating class <unknown> in RecyclerView
【发布时间】:2019-06-28 13:50:39
【问题描述】:

真的很烦。

当我在任何隔离活动或片段中使用 TintImageView 或 FloatingActionButton 时,它们都运行良好。

但是当我在 RecyclerView 中使用它们时,会出现以下异常: android.view.InflateException:

android.view.InflateException: Binary XML file line #79: Error inflating class "unknown"

这是完整版:

5882-5882/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.*********, PID: 5882
android.view.InflateException: Binary XML file line #79: Error inflating class <unknown>
        at android.view.LayoutInflater.createView(LayoutInflater.java:640)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:775)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:778)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:778)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:778)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:512)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:409)
        at com.*********.ui.adapters.CreditList_MineAdapter.onCreateViewHolder(CreditList_MineAdapter.java:33)
        at com.*********.ui.adapters.CreditList_MineAdapter.onCreateViewHolder(CreditList_MineAdapter.java:23)
        at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5288)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4551)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4461)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1962)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1371)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1334)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:563)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2847)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3145)
        at android.view.View.layout(View.java:14878)
        at android.view.ViewGroup.layout(ViewGroup.java:4655)
        at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:581)
        at android.view.View.layout(View.java:14878)
        at android.view.ViewGroup.layout(ViewGroup.java:4655)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:14878)
        at android.view.ViewGroup.layout(ViewGroup.java:4655)
        at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1627)
        at android.view.View.layout(View.java:14878)
        at android.view.ViewGroup.layout(ViewGroup.java:4655)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1697)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1551)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1460)
        at android.view.View.layout(View.java:14878)
        at android.view.ViewGroup.layout(ViewGroup.java:4655)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:14878)
        at android.view.ViewGroup.layout(ViewGroup.java:4655)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:14878)
        at android.view.ViewGroup.layout(ViewGroup.java:4655)
        at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1043)
        at android.view.View.layout(View.java:14878)
        at android.view.ViewGroup.layout(ViewGroup.java:4655)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1697)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1551)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1460)
        at android.view.View.layout(View.java:14878)
        at android.view.ViewGroup.layout(ViewGroup.java:4655)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
        at android.view.View.layout(View.java:14878)
        at android.view.ViewGroup.layout(ViewGroup.java:4655)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1697)
        at android.widget.LinearLayout.layoutVertical

好的,我会发布我的源代码。

这是我的毕业作品:

android {
compileSdkVersion 23
buildToolsVersion "22.0.1"

defaultConfig {
    applicationId "com.*******"
    minSdkVersion 14
    targetSdkVersion 22
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:cardview-v7:23.0.1'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.android.support:palette-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
...
}

和RecyclerView项目布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
android:id = "@+id/card_root"
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:card = "http://schemas.android.com/apk/res-auto"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:background = "?android:attr/selectableItemBackground"
card:cardBackgroundColor = "#F1CC9D"
card:cardCornerRadius = "0dp"
card:cardElevation = "4dp"
card:cardPreventCornerOverlap = "true"
card:cardUseCompatPadding = "true"
card:contentPadding = "4dp"> 

<LinearLayout
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
    android:orientation = "vertical"
    android:weightSum = "100">

    <FrameLayout
        android:layout_width = "match_parent"
        android:layout_height = "32dp">

        <TextView
            android:id = "@+id/text_name"
            android:layout_width = "match_parent"
            android:layout_height = "match_parent"
            android:layout_gravity = "left|center_vertical"
            android:gravity = "center_vertical"
            android:maxLines = "2"
            android:paddingLeft = "8dp"
            android:paddingRight = "8dp"
            android:singleLine = "true"
            android:text = "****\n****"
            android:textColor = "@color/primary_dark_material_dark"
            android:textSize = "16sp"
            android:textStyle = "bold"/>

    </FrameLayout>

    <View
        android:layout_width = "match_parent"
        android:layout_height = "1dp"
        android:layout_gravity = "bottom"
        android:layout_marginLeft = "8dp"
        android:layout_marginRight = "8dp"
        android:background = "#7B030B"/>

    <LinearLayout
        android:layout_width = "match_parent"
        android:layout_height = "32dp"
        android:orientation = "horizontal"
        android:weightSum = "2">

        <RelativeLayout
            android:layout_width = "0dp"
            android:layout_height = "32dp"
            android:layout_weight = "1">

            <android.support.v7.widget.CardView
                android:layout_width = "wrap_content"
                android:layout_height = "match_parent"
                android:layout_margin = "4dp"
                android:layout_weight = "128"
                card:cardBackgroundColor = "@android:color/transparent"
                card:cardElevation = "-2dp">

                <android.support.v7.internal.widget.TintImageView
                    android:layout_width = "wrap_content"
                    android:layout_height = "wrap_content"
                    android:layout_gravity = "center"
                    android:src = "@mipmap/ic_today_black_48dp"
                    android:tint = "?attr/colorPrimaryDark"/>
            </android.support.v7.widget.CardView>

            <TextView
                android:id = "@+id/text_deadline"
                android:layout_width = "wrap_content"
                android:layout_height = "match_parent"
                android:layout_alignParentRight = "true"
                android:layout_centerVertical = "true"
                android:gravity = "right|center_vertical"
                android:paddingLeft = "8dp"
                android:paddingRight = "8dp"
                android:text = "2015-01-01"
                android:textColor = "@color/primary_dark_material_dark"
                android:textSize = "16sp"/>

        </RelativeLayout>

        <RelativeLayout
            android:layout_width = "0dp"
            android:layout_height = "32dp"
            android:layout_weight = "1">

            <android.support.v7.widget.CardView
                android:layout_width = "wrap_content"
                android:layout_height = "match_parent"
                android:layout_margin = "4dp"
                android:layout_weight = "128"
                card:cardBackgroundColor = "@android:color/transparent"
                card:cardElevation = "-2dp">

                <android.support.v7.internal.widget.TintImageView
                    android:layout_width = "wrap_content"
                    android:layout_height = "wrap_content"
                    android:layout_gravity = "center"
                    android:src = "@mipmap/ic_credit_card_black_48dp"
                    android:tint = "?attr/colorPrimaryDark"/>
            </android.support.v7.widget.CardView>

            <TextView
                android:id = "@+id/text_credit"
                android:layout_width = "wrap_content"
                android:layout_height = "match_parent"
                android:layout_alignParentRight = "true"
                android:layout_centerVertical = "true"
                android:gravity = "right|center_vertical"
                android:paddingLeft = "8dp"
                android:paddingRight = "8dp"
                android:text = "0987654321"
                android:textColor = "#7B020B"
                android:textSize = "16sp"/>

        </RelativeLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width = "match_parent"
        android:layout_height = "32dp"
        android:orientation = "horizontal"
        android:weightSum = "2">

        <RelativeLayout
            android:layout_width = "0dp"
            android:layout_height = "32dp"
            android:layout_weight = "1">

            <android.support.v7.widget.CardView
                android:layout_width = "wrap_content"
                android:layout_height = "match_parent"
                android:layout_margin = "4dp"
                android:layout_weight = "128"
                card:cardBackgroundColor = "@android:color/transparent"
                card:cardElevation = "-2dp">

                <android.support.v7.internal.widget.TintImageView
                    android:layout_width = "wrap_content"
                    android:layout_height = "wrap_content"
                    android:layout_gravity = "center"
                    android:src = "@mipmap/ic_assignment_ind_white_48dp"
                    android:tint = "?attr/colorPrimaryDark"/>
            </android.support.v7.widget.CardView>

            <TextView
                android:id = "@+id/text_postedby"
                android:layout_width = "wrap_content"
                android:layout_height = "match_parent"
                android:layout_alignParentRight = "true"
                android:layout_centerVertical = "true"
                android:gravity = "right|center_vertical"
                android:paddingLeft = "8dp"
                android:paddingRight = "8dp"
                android:text = "null"
                android:textColor = "@color/primary_dark_material_dark"
                android:textSize = "16sp"/>

        </RelativeLayout>

        <RelativeLayout
            android:layout_width = "0dp"
            android:layout_height = "32dp"
            android:layout_weight = "1">

            <android.support.v7.widget.CardView
                android:layout_width = "wrap_content"
                android:layout_height = "match_parent"
                android:layout_margin = "4dp"
                android:layout_weight = "128"
                card:cardBackgroundColor = "@android:color/transparent"
                card:cardElevation = "-2dp">

                <android.support.v7.internal.widget.TintImageView
                    android:layout_width = "wrap_content"
                    android:layout_height = "wrap_content"
                    android:layout_gravity = "center"
                    android:src = "@mipmap/ic_local_grocery_store_white_48dp"
                    android:tint = "?attr/colorPrimaryDark"/>
            </android.support.v7.widget.CardView>

            <TextView
                android:id = "@+id/text_usedby"
                android:layout_width = "wrap_content"
                android:layout_height = "match_parent"
                android:layout_alignParentRight = "true"
                android:layout_centerVertical = "true"
                android:gravity = "right|center_vertical"
                android:paddingLeft = "8dp"
                android:paddingRight = "8dp"
                android:text = "null"
                android:textColor = "@color/primary_dark_material_dark"
                android:textSize = "16sp"/>

        </RelativeLayout>
    </LinearLayout>

</LinearLayout>

<ImageView
    android:id = "@+id/image"
    android:layout_width = "100dp"
    android:layout_height = "100dp"
    android:layout_gravity = "right|top"
    android:layout_margin = "8dp"
    android:src = "@mipmap/ic_seal_used"
    android:visibility = "gone"/>
</android.support.v7.widget.CardView>

RecyclerView Adapter 是这样的:

public class CreditList_MineAdapter
    extends BaseRecyclerAdapter< CreditList_MineAdapter.CreditViewHolder, Credit > {

public CreditList_MineAdapter ( Context context, ArrayList< Credit > list ) {
    super( context, list );
}
@Override
public CreditViewHolder onCreateViewHolder ( ViewGroup parent, int viewType ) {
    CreditViewHolder holder = new CreditViewHolder(
            LayoutInflater.from( mContext )
                          .inflate( R.layout.listitem_credit_list_mine, parent, false )
    );
    return holder;
}
@Override
protected void onBindViewHolderBase ( CreditViewHolder holder, int position ) {
    final Credit mCreditAtPosition = mList.get( position );

    holder.mTextView_Name.setText( mCreditAtPosition.getName() );
    holder.mTextView_Credit.setText( mCreditAtPosition.getCredit() );
    try {
        holder.mTextView_End.setText(
                mCreditAtPosition.getDeadLineDate() == null ? "" : Credit.YYYY_MM_DD.format(
                        Credit.YYYY_MM_DD.parse( mCreditAtPosition.getDeadLineDate().getDate() )
                )
        );
    }
    catch ( ParseException e ) {
        e.printStackTrace();
    }
    holder.mTextView_PostBy.setText(
            mCreditAtPosition.getPostedBy() == null ? "" :
                    TextUtils.isEmpty( mCreditAtPosition.getPostedBy().getUsername() ) ?
                            mCreditAtPosition.getPostedByName() :
                            mCreditAtPosition.getPostedBy().getUsername()

    );
    holder.mTextView_UsedBy.setText(
            mCreditAtPosition.getUsedBy() == null ? "" :
                    TextUtils.isEmpty( mCreditAtPosition.getUsedBy().getUsername() ) ?
                            mCreditAtPosition.getUsedByName() :
                            mCreditAtPosition.getUsedBy().getUsername()
    );
    if ( mCreditAtPosition.isUsed() ) {
        holder.mCardView.setCardBackgroundColor( R.color.material_design_colors_grey_500 );
        holder.mImageView.setVisibility( View.VISIBLE );
        holder.mImageView.setImageResource( R.mipmap.ic_seal_used );
        return;
    }
    if ( mCreditAtPosition.isOutOfDate() ) {
        holder.mCardView.setCardBackgroundColor( R.color.material_design_colors_grey_600 );
        holder.mImageView.setVisibility( View.VISIBLE );
        holder.mImageView.setImageResource( R.mipmap.ic_seal_outofdate );
        return;
    }
    holder.mCardView.setCardBackgroundColor( Color.parseColor( "#F1CC9D" ) );
    holder.mImageView.setVisibility( View.GONE );
}

class CreditViewHolder extends RecyclerView.ViewHolder {
    @InjectView ( R.id.text_name )
    TextView mTextView_Name;
    @InjectView ( R.id.text_credit )
    TextView mTextView_Credit;
    @InjectView ( R.id.text_deadline )
    TextView mTextView_End;
    @InjectView ( R.id.text_postedby )
    TextView mTextView_PostBy;
    @InjectView ( R.id.text_usedby )
    TextView mTextView_UsedBy;
    @InjectView ( R.id.card_root )
    CardView mCardView;
    @InjectView ( R.id.image )
    ImageView mImageView;

    public CreditViewHolder ( View view ) {
        super( view );
        ButterKnife.inject( this, view );
    }
}
}

错误日志指向这一行:

CreditViewHolder 持有人 = 新 CreditViewHolder( LayoutInflater.from(mContext) .inflate(R.layout.listitem_credit_list_mine,父母,假) );

我在 SOF 上尝试了一些类似的问题,但没有一个可以像这样解决我的问题。 所以我希望有人能给我一个提示吗? 非常感谢!

对不起,我的英语不好!

对不起,我忘了说我的设备操作系统是 Android 4.4.2 API19。

编辑:

另外,片段中的代码

 mList = new ArrayList< Credit >();
    switch (mPosition) {
        case POSITION_0_FRESH:
            mAdapter =
                    new CreditList_FreshAdapter( getActivity().getApplicationContext(), mList );
            mAdapter.setRecyclerViewOnItemClickLitener( this );
            break;
        case POSITION_1_USED:
        case POSITION_2_USEDBYME:
            mAdapter =
                    new CreditList_UsedAdapter( getActivity().getApplicationContext(), mList );
            break;
        case POSITION_3_POSTBYME:
            mAdapter =
                    new CreditList_MineAdapter( getActivity().getApplicationContext(), mList );
            break;
        case POSITION_4_OUTOFDATE:
            mAdapter = new CreditList_OutofDateAdapter(
                    getActivity().getApplicationContext(), mList
            );
            break;
        default:
            mAdapter =
                    new CreditList_FreshAdapter( getActivity().getApplicationContext(), mList );
            break;
    }
    mRecyclerView.setAdapter( mAdapter );
    mRecyclerView.setLayoutManager( new LinearLayoutManager( getActivity() ) );

BaseRecyclerAdapter 是这样的:

public abstract class BaseRecyclerAdapter < VH extends RecyclerView.ViewHolder, T >
    extends RecyclerView.Adapter< VH > {

protected Context mContext;
protected List< T > mList;
protected RecyclerViewOnItemClickLitener mRecyclerViewOnItemClickLitener;
public BaseRecyclerAdapter ( Context inContext, List< T > inList ) {
    this.mContext = inContext;
    this.mList = inList;
}
public T getItemAtPosition ( int inPosition ) {
    if ( mList != null ) {
        return mList.get( inPosition );
    }
    return null;
}
public void setRecyclerViewOnItemClickLitener (
        RecyclerViewOnItemClickLitener mRecyclerViewOnItemClickLitener
) {
    this.mRecyclerViewOnItemClickLitener = mRecyclerViewOnItemClickLitener;
}
@Override
public void onBindViewHolder ( final VH holder, int position ) {
    onBindViewHolderBase( holder, position );
    if ( mRecyclerViewOnItemClickLitener != null ) {
        holder.itemView.setOnClickListener(
                new View.OnClickListener() {

                    @Override
                    public void onClick ( View v ) {
                        if ( mRecyclerViewOnItemClickLitener != null )
                            mRecyclerViewOnItemClickLitener.onItemClick(
                                    holder.itemView, holder.getLayoutPosition()
                            );
                    }
                }
        );
        holder.itemView.setOnLongClickListener(
                new View.OnLongClickListener() {

                    @Override
                    public boolean onLongClick ( View v ) {
                        if ( mRecyclerViewOnItemClickLitener != null )
                            mRecyclerViewOnItemClickLitener.onItemLongClick(
                                    holder.itemView, holder.getLayoutPosition()
                            );
                        return false;
                    }
                }
        );
    }
}
protected abstract void onBindViewHolderBase ( VH holder, int position );

@Override
public int getItemCount () {
    return mList == null ? 0 : mList.size();
}

}

【问题讨论】:

  • LayoutInflater.createView 中放置一个断点并调试您的代码,如此简单!
  • 在初始化回收站视图的位置显示活动代码
  • @Android Weblineindia 活动代码已发布,如果我在 listitem 布局中删除 TintImageView,它将正常运行!

标签: android


【解决方案1】:

android:background="?attr/selectableItemBackground" 引起了几个充气问题,如果没有必要,只需将其删除并重试 或者 一起试试

android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"

【讨论】:

  • 这不是问题,但它有很大帮助!在 XML 这一行 引起了麻烦,当我删除它们时,问题就解决了。有点像你的回答,非常感谢!
【解决方案2】:

我认为您尚未初始化 mContext 变量。在 CreditList_MineAdapter() 构造函数中将其初始化为 mContext=context。试试这个。希望它可能会有所帮助。

【讨论】:

  • 其实我是这样做的。我重构了一个名为“BaseRecyclerAdapter”的父适配器,并且在该类中我确实启动了受保护的字段 mContext。如您所见,此 CreditList_MineAdapter 扩展了 BaseRecyclerAdapter。
  • 事实上我认为如果 mContext 没有被启动 "LayoutInflater.from( mContext )" 可能会抛出一些异常,比如空指针什么的。
【解决方案3】:

不适合我。

@Override
        public ViewHolders onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
               View v = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, viewGroup, false);
               return new ViewHolders(v);
         } 

为我工作

public ViewHolders onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
       View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.item, viewGroup, false);
       return new ViewHolders(v);
}

只需放置 MainActivity.this 而不是 getApplicationContext()

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多