Warm tip: This article is reproduced from serverfault.com, please click

Custom View Error: Binary XML file line #0: You must supply a layout_width attribute

发布于 2018-03-05 20:55:31

I have implemented a simple custom view in my app, but I am always getting this run time error when trying to use it:

java.lang.RuntimeException: Unable to start activity ...
Caused by: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class EmptyReviewView
Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class EmptyReviewView
Caused by: java.lang.reflect.InvocationTargetException
Caused by: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: You must supply a layout_width attribute.

Caused by: java.lang.UnsupportedOperationException: Binary XML file line #0: You must supply a layout_width attribute.

I looked for any missing layout_width but did not find any. This is my custom view's XML:

<?xml version="1.0" encoding="utf-8"?>
   <merge xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center"
   android:orientation="vertical"
   tools:parentTag="android.widget.LinearLayout">

   <ImageView
       android:layout_width="68dp"
       android:layout_height="68dp"
       android:layout_marginBottom="6dp"
       android:layout_marginTop="24dp"
       android:scaleType="fitCenter"
       app:srcCompat="@drawable/ic_review_hand_stars" />

   <TextView
       style="@style/TextGuide.Body.1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center"
       android:layout_marginBottom="4dp"
       android:layout_marginTop="6dp"
       android:gravity="center"
       android:text="@string/no_reviews_yet"
       android:textAppearance="@style/TextGuide.Body.1"
       android:textColor="@color/fib_color_grey_6" />

   <TextView
       style="@style/TextGuide.Body.1"
       android:layout_width="180dp"
       android:layout_height="wrap_content"
       android:layout_gravity="center"
       android:layout_marginBottom="24dp"
       android:layout_marginTop="4dp"
       android:gravity="center"
       android:text="@string/be_the_first_one_to_review_this_item"
       android:textAppearance="@style/TextGuide.Body.1"
       android:textColor="@color/fib_color_grey_5" />
   <TextView />

</merge>

And this is the custom view's class:

public class EmptyReviewView extends LinearLayout {

  public EmptyReviewView(Context context) {
      this(context, null, 0);
  }

  public EmptyReviewView(Context context, @Nullable AttributeSet attrs) {
      this(context, attrs, 0);
  }

  public EmptyReviewView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
      super(context, attrs, defStyleAttr);
      initView();
  }

  @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  public EmptyReviewView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
      super(context, attrs, defStyleAttr, defStyleRes);
      initView();
  }

  private void initView() {
      LayoutInflater.from(getContext()).inflate(R.layout.view_review_empty, this, true);
      setOrientation(VERTICAL);
      setGravity(Gravity.CENTER);
  }

}

And this is how I use it on Fragments/Activities layouts:

<EmptyReviewView
            android:id="@+id/no_ratings_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

The thing even displays correctly in the Layout Preview, but the app crashes as soon as the fragment is displayed. Commenting out the view from the fragment makes it work, so this is definitely the issue:

Screenshot of the layout preview

Questioner
Felipe Ribeiro R. Magalhaes
Viewed
0
JaFer 2018-03-06 05:22:10

In your layout, after the last TextView you have this <TextView />. Remove it and then the app will run correctly.