我在这里有一个自定义视图,然后我想要一些小部件。
<com.zone.manager.Tab3
android:id="@+id/tab3_display"
android:layout_width="fill_parent"
android:layout_height="620dp" >
<Button
android:id="@+id/addZone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add Zone" />
</com.zone.manager.Tab3>
现在我想将该按钮设置为onclicklistener,这样我就可以在View类中使用它了所以我这样做了......
addZone = (Button) findViewById(R.id.addZone);
addZone.setOnClickListener(this);
我在
中设置了它public class Tab3 extends ViewGroup implements OnTouchListener, OnClickListener
Public Tab3(Context context, AttributeSet attrs)
{
super (context, attrs);
// here
}
当我扩展ViewGroup时,它让我实现了这个
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b)
{
// TODO Auto-generated method stub
}
为了使这项工作,我有什么东西可以放在这里吗?
但是当我尝试运行应用程序时它会崩溃,但是如果我// addZone.setOnClickListener(this);
该应用程序运行正常,对我有什么帮助吗?
突片
th.setup();
TabSpec specs = th.newTabSpec("tag0");
specs.setContent(R.id.connecttionTab);
specs.setIndicator("Connection Tab");
th.addTab(specs);
specs = th.newTabSpec("tag1");
specs.setContent(R.id.tab1);
specs.setIndicator("Zone Manager");
th.addTab(specs);
specs = th.newTabSpec("tag2");
specs.setContent(R.id.tab2);
specs.setIndicator("",res.getDrawable(R.drawable.ic_tab_vaccontrol));
th.addTab(specs);
//this is the tab that has all this vvv
specs = th.newTabSpec("tag3");
specs.setContent(R.id.tab3);
specs.setIndicator("Graphical Layout");
th.addTab(specs);
答案 0 :(得分:2)
在您的xml中,您的自定义视图不会包含按钮;这是一个兄弟的观点。您的应用崩溃的原因是findViewById(R.id.addZone)
正在返回null
,因此您在致电NullPointerException
时收到addZone.setOnClickListener(this)
。如果您希望自定义视图包含按钮,则xml必须如下所示:
<com.zone.manager.Tab3
android:id="@+id/tab3_display"
android:layout_width="fill_parent"
android:layout_height="620dp" >
<Button
android:id="@+id/addZone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add Zone" />
</com.zone.manager.Tab3>
此外,您的Tab3
课程必须延长ViewGroup
,而不是View
。这可能会有点复杂,因为您还需要编写代码来进行布局。该按钮也将显示在Tab3
视图中。
修改强>
根据您对所尝试内容的评论,我不建议使用上述方法。相反,您应该将自定义视图和Button包装在LinearLayout
中。例如,以下布局将按钮放在屏幕的左下角,并在Tab3视图中填充其上方的区域:
<强> RES / layout.tab3.xml 强>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<com.zone.manager.Tab3
android:id="@+id/tab3_display"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:id="@+id/addZone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onAddZone"
android:text="Add Zone" />
</LinearLayout>
然后,将点击处理逻辑移动到您Tab3
类可见的Activity
中的单独方法。 (我们假设它被称为addZone()
。)Tab3
类不应该实现OnClickListener
并且应该扩展View
(不是ViewGroup
,如上所述)。通过向按钮添加android:onClick
属性,您无需向按钮添加OnClickListener
。相反,您需要在活动中实现该名称的单击方法:
private Tab3 mTab3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab3);
mTab3 = (Tab3) findViewById(R.id.tab3_display);
// . . .
}
@Override
/**
* Called when a view with attribute android:onClick="onAddZone"
* is clicked.
*
* @param view the view that was clicked.
*/
public void onAddZone(View view) {
mTab3.addZone();
}
虽然代码中没有关于按钮的内容,但框架会自动使用反射连接所有内容,以便在单击按钮时调用活动的onAddZone
方法。
答案 1 :(得分:0)
在xml文件中放置布局时,这不是扩展视图组的正确方法。您需要将xml更改如下:
R.layout.xml_file_for_custom_view
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:parentTag="com.zone.manager.Tab3">
<Button
android:id="@+id/addZone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add Zone" />
</merge>
在用于自定义视图的代码中,您需要膨胀xml并添加onclick侦听器:
Tab3.java
public class Tab3 extends ViewGroup implements OnTouchListener, OnClickListener
public Tab3(Context context, AttributeSet attrs) {
super (context, attrs);
// inflate and attach the layout to this viewgroup
View.inflate(getContext(), R.layout.xml_file_for_custom_view, this);
}
@Override
public void onFinishInflate() {
super.onFinishInflate();
// Now you can find the button
addZone = (Button) findViewById(R.id.addZone);
addZone.setOnClickListener(this);
}
}
现在无论您在哪里使用自定义视图,都可以执行以下操作:
<com.zone.manager.Tab3
android:id="@+id/tab3_display"
android:layout_width="fill_parent"
android:layout_height="620dp"/>
关于您对onLayout
方法的疑问:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
}
是的,您将需要在其中放置一些代码。请参见this guide,以帮助您入门。