Hello World多个按钮分开操作

时间:2011-10-23 05:24:26

标签: java android

我是Android开发的新手,并且还没有在java中编写GUI,所以按钮工作对我来说都是新手。

我正在创建一个简单的hello world应用程序,有一些按钮/无线电/复选框等等。我们必须想办法让它变得更好,简介中没有任何具体内容。所以我想我会得到一些按钮并显示不同种类的烤面包,也许会改变背景等。

所以我根据教程实现了一个toast,但它适用于所有实例化的按钮,而不仅仅是我想要的按钮。我希望另一个按钮可以做其他事情。

我认为它与onClickListener有关,但除此之外,我被卡住了。

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btn1 = (Button) findViewById(R.id.button1);
        btn1.setOnClickListener(this);

        btn2 = (Button) findViewById(R.id.button2);
        btn2.setOnClickListener(this);


        cb=(CheckBox)findViewById(R.id.check);
        cb.setOnCheckedChangeListener(this);

        browser=(WebView)findViewById(R.id.webkit);
        browser.loadUrl("http://www.google.com/search");

        }


    public void onClick(View v) {
        new AlertDialog.Builder(this).setTitle("MessageDemo").setMessage(
                "This is an Alert Dialogue Toast").setNeutralButton(
                "Here, here!", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dlg, int sumthin) {
                        Toast.makeText(HelloWorldActivity.this,
                                "<clink, clink>", Toast.LENGTH_SHORT).show();
                    }
                }).show();
    }

这里是按钮的xml

 <Button android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Testa" 
    android:layout_weight="0.2"></Button>

3 个答案:

答案 0 :(得分:4)

您已为每个按钮添加了相同的onClickListener,因此它们将具有相同的行为。您实际上可以在setOnClickListener调用中创建侦听器,如下所示:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btn1 = (Button) findViewById(R.id.button1);
    btn1.setOnClickListener( new OnClickListener() {
        public void onClick(View v) {
            new AlertDialog.Builder(this).setTitle("MessageDemo").setMessage(
                "This is an Alert Dialogue Toast").setNeutralButton(
                "Here, here!", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dlg, int sumthin) {
                        Toast.makeText(HelloWorldActivity.this,
                            "<clink, clink>", Toast.LENGTH_SHORT).show();
                    }
            }).show();            
        }
    });

    btn2 = (Button) findViewById(R.id.button2);
    btn2.setOnClickListener( new OnClickListener() {
        public void onClick(View v) {
            // Do something different here.
        }
    });

    // The rest of onCreate
}

编辑:我已经更新了答案,以明确原始代码的哪些部分会放在哪里,但我通常不会在onClick内部粘贴大量代码,因为它不是很可读。我更喜欢这样的东西:

public void onCreate(Bundle savedInstanceState) {
   // other onCreate code
    btn1 = (Button) findViewById(R.id.button1);
    btn1.setOnClickListener( new OnClickListener() {
        public void onClick(View v) {
            showBtn1ClickedDialog();
        }
    });
   // other onCreate code
}

private void showBtn1ClickedDialog() {
    new AlertDialog.Builder(this).setTitle("MessageDemo").setMessage(
        "This is an Alert Dialogue Toast").setNeutralButton(
        "Here, here!", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dlg, int sumthin) {
                Toast.makeText(HelloWorldActivity.this,"<clink, clink>", Toast.LENGTH_SHORT).show();
            }
    }).show();            
}

答案 1 :(得分:3)

除了goto10的解决方案之外,如果你不想在线定义监听器,你现有的点击处理程序可以检查视图的ID:

public void onClick(View view) {
    switch (view.getId()) {
        case R.id.about_button:
            // handle about
            break;
        // etc.

我倾向于使用goto10的解决方案,甚至是内部类,而不是像这样的switch语句,但它是另一种选择。那就是说,我正在表达他/她的答案,而不是我的答案。

使用switch而不是内部类的一个原因是内存使用,尽管使用现代设备,这可能不是一个大问题 - 但每个内部类确实占用更多空间,如果处理程序很小,IMO以这种方式更有效率。

答案 2 :(得分:1)

单击任何按钮会生成一个由onClick eventListener捕获的事件。但它不会自动区分哪个事件产生了事件。这些信息包含在 View v 中,并且通过在视图中使用切换案例,我们可以为不同的点击设置单独的事件。

@Override
    public void onClick(View v) {
        switch(v.getId()){      
            case R.id.btn1:
                //Do something here
                break;
            case R.id.btn2: 
                //Do something else here
                 break;
            case R.id.btn3:

                 break;
        }   
    }

summary如何在应用程序中使用监听器。