自定义视图按钮

时间:2012-06-10 02:46:08

标签: android class view android-widget

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

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

2 个答案:

答案 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,以帮助您入门。