0

我这里有一个自定义视图,然后我想要一些小部件来配合它。

<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);
4

2 回答 2

3

在您的 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按钮。相反,您需要在活动中实现该名称的 click 方法:

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单击按钮时调用活动的方法。

于 2012-06-10T02:52:51.470 回答
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
}

是的,您需要在其中放置一些代码。请参阅本指南以帮助您入门。

于 2020-06-23T23:17:39.577 回答