膨胀自定义视图会导致错误

时间:2013-01-21 09:16:53

标签: android android-layout relativelayout layout-inflater

我创建了一个包含ImageButton和TextView的自定义视图。这是我的布局:

<merge xmlns:android="http://schemas.android.com/apk/res/android">

     <ImageButton android:id="@+id/image_button"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content" />

     <TextView android:id="@+id/text_view"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:clickable="false"
               android:layout_margin="1dp" />    
</merge>

我还有一个继承自RelativeLayout的类,名为CustomImageButton。这是它代码的一部分:

public class CustomImageButton extends RelativeLayout {

    ...

    public CustomImageButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.attributes = context.obtainStyledAttributes(attrs, R.styleable.CustomImageButton);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        ((Activity)getContext()).getLayoutInflater().inflate(R.layout.custom_image_button, this);
        this.setClickable(false);
        setupViewItems();
    }

    private void setupViewItems() {
          // DO STUFF HERE TO THE IMAGE BUTTON AND TEXT VIEW
          // FROM THE CUSTOM ATTRIBUTES 
    }
}

这些是自定义图像按钮的自定义属性:(attrs.xml)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomImageButton">
        <attr name="image_src" format="integer" />
        <attr name="text" format="string" />
        <attr name="text_size" format="dimension" />
        <attr name="text_top_padding" format="integer" />
        <attr name="text_alginment">
            <enum name="left" value="1"/>
            <enum name="right" value="2"/>
            <enum name="center" value="3"/>
        </attr>
        <attr name="text_color" format="color"/>
    </declare-styleable>
</resources>

最后这是主要的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:weightSum="3" xmlns:app="http://schemas.android.com/apk/res/com.company.product.sp">

    <View
        android:layout_width="fill_parent"
        android:layout_height="0px"
        android:layout_weight="1" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="4" >

        <View
            android:layout_width="0px"
            android:layout_height="2px"
            android:layout_weight="1" />

        <com.company.product.ui.views.CustomImageButton
            android:id="@id/main_command"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            app:image_src="@drawable/main_activity"
            app:text="@string/item_title"
            app:text_size="@dimen/main_menu_item_text"
            app:text_top_padding="55"
            app:text_alginment="center"
            app:text_color="@android:color/black" />
</LinearLayout>
</LinearLayout>

现在,针对这个问题。当我在Android 4.0.2和更高版本上运行我的应用程序时一切都很好但是当我在Android 2.2.1上运行我的应用程序时我得到了

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

根据堆栈跟踪(非常无法提供信息),当我调用CustomImageButton方法时,onFinishInflate方法中的inflate类抛出异常。任何想法为什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果调用其他两个构造函数中的任何一个(带有一个或三个参数),则会发生这种情况 - 然后this.attributes不会被设置。这种情况发生在我的案例中。

public SelectorButton(Context context) {
    super(context);
    _context = context;
}

public SelectorButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    _context = context;
    init(attrs);
}

public SelectorButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    _context = context;
    init(attrs);
}

您可以看到我只在第二个和第三个构造函数中初始化属性。