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

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

我在我的应用程序中实现了一个简单的自定义视图,但我在尝试使用它时总是遇到这个 运行 时间错误:

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.

原因:java.lang.UnsupportedOperationException:二进制 XML 文件行 #0:您必须提供 layout_width 属性。

我寻找任何丢失的 layout_width 但没有找到。这是我的自定义视图 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>

这是自定义视图的 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);
  }

}

这就是我在 Fragments/Activities 布局上使用它的方式:

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

这个东西甚至在布局预览中正确显示,但一旦显示片段,应用程序就会崩溃。从片段中注释掉视图使其工作,所以这绝对是问题所在:

在您的布局中,在最后一个 TextView 之后,您有这个 <TextView />。删除它,然后应用程序将 运行 正确。

这是一个较旧的问题,但为了其他人的利益分享答案。

可能需要检查维度文件或“只分配了数字但没有必需后缀的值”,例如 'sp''dp'.

这个很难发现的运行时错误(“你必须提供一个 layout_width 属性”)在我们的案例中是由于在 维度文件 中的值没有像 'sp' 或 'dp' 这样的必需后缀(只有数字作为值给出但没有类似的后缀'dp').

示例:<dimen name="Setting_txt_size">16</dimen> 而不是 <dimen name="Setting_txt_size">16sp</dimen>,其中 '16sp' 只是 '16' 导致系统抛出运行时错误。不幸的是,这种类型的错误在编码过程中从未出现过,编译成功但在尝试渲染相应的 activity 时使应用程序崩溃。希望这对面临此问题的人有所帮助。

注:

  • 维度文件不接受没有所需后缀的数值
  • 感谢对我们有帮助的回答available here