【发布时间】:2016-04-04 12:24:20
【问题描述】:
我正在尝试实现一个简单的自定义拨号盘视图。在我尝试使用 <include> 为我的按钮包含一个“模板”而不是在 XML 文件中显式定义每个按钮之前,一切正常。因为我将拥有 12 个几乎相同的按钮,所以我想我可以通过这样做让我的 XML 更整洁、更短。
问题是在我的自定义视图中的onFinishInflate() 中,当我调用findViewById(R.id.dialpad_view_btn1) 时它返回null。我当然将 ID dialpad_view_btn1 分配给我的 <include> 之一。如果我只是明确定义按钮而不是从我的“模板”中包含它,它就可以正常工作。有什么解决方法吗,还是我应该接受findViewById() 和<include> 不能很好地配合?
DialPadView.java
public class DialPadView extends android.support.v7.widget.GridLayout {
public DialPadView(Context context) {
super(context);
initializeViews(context);
}
public DialPadView(Context context, AttributeSet attrs) {
super(context, attrs);
initializeViews(context);
}
public DialPadView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initializeViews(context);
}
private void initializeViews(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.dialpad_view, this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
// This call to findViewById() results in a NullPointerException
((ImageButton) findViewById(R.id.dialpad_view_btn1)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// I'm just a dummy
}
});
}
}
dialpad_view.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.GridLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.me.myproject.DialPadView"
xmlns:grid="http://schemas.android.com/apk/res-auto"
android:id="@+id/dialpad_grid_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
grid:alignmentMode="alignMargins"
grid:columnCount="3"
grid:rowCount="4">
<include
android:id="@+id/dialpad_view_btn1"
layout="@layout/dialpad_button" />
<include
android:id="@+id/dialpad_view_btn2"
layout="@layout/dialpad_button" />
</android.support.v7.widget.GridLayout>
dialpad_button.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:grid="http://schemas.android.com/apk/res-auto">
<Button
android:layout_width="0dp"
android:layout_height="0dp"
grid:layout_columnWeight="1"
grid:layout_rowWeight="1"
grid:layout_gravity="fill"
android:layout_margin="5dp"
android:scaleType="centerInside"
android:text="Test" />
</merge>
【问题讨论】:
-
尝试从
dialpad_button.xml中删除<merge>标签,使<Button>成为该文件的根目录。 -
在您的 xml 中使用
,而不是 -
@pskink 那是 XML for
DialPadView,而不是使用自定义视图的布局。 -
我不明白你,那你在哪里创建 DialPadView?
-
@pskink 当然,在我的
Activity的布局中,我认为我不需要包含它,因为它与问题无关?你认为我也应该包括AndroidManifest.xml、build.gradle等?
标签: java android android-layout android-custom-view android-xml