我创建了一个包含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
类抛出异常。任何想法为什么以及如何解决这个问题?
答案 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);
}
您可以看到我只在第二个和第三个构造函数中初始化属性。