2 plantago Plantago 于 2016.01.27 09:17 提问

有多个button 如何监听

如题,我用表格布局做了很多个button,我想要的结果是:随便点击一个button,返回button上的文本。但是如果我每个button都有id、都要find、都要监听,岂不是很麻烦?求大神给个更简洁的方案,谢谢。

7个回答

leilba
leilba   Rxr 2016.01.27 09:36
已采纳

如果所有按钮操作都一样的话,那也简单

 //你的activity
public class MainActivity extends Activity implements View.OnClickListener {

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_1: 
                        case R.id.btn_2: 
                        case R.id.btn_3: 
                        case R.id.btn_4: 
                        case R.id.btn_5: 
                        case R.id.btn_6: 
                        case R.id.btn_7: 
                        // 好了,全部获取到了
                        String text =( (Button)v).getText().toString();

                        break;
                }
}

leilba
leilba 回复Plantago: = ̄ω ̄= 共同进步,以后有其他问题也可以找我哦
接近 2 年之前 回复
Plantago
Plantago 了了,谢谢你的耐心解答= ̄ω ̄=
接近 2 年之前 回复
leilba
leilba 回复Plantago: 只要layout里面写的方法名的和activity里面的定义的方法名一致就行了
接近 2 年之前 回复
leilba
leilba 回复Plantago: 可以不用onClick,,名字改成其他的都可以,我这里之所以用OnClickListener是为了偷懒,自动生成onClick,嘿嘿。。。
接近 2 年之前 回复
Plantago
Plantago 嘿,成功了。原来是我刚刚把case注释了(⊙﹏⊙)b。不过还有最后一个疑惑:onClick是OnClickListener的方法啊,这样做好像以后可能会冲突的感觉:-(
接近 2 年之前 回复
leilba
leilba 回复Plantago: 不需要find和setonclickListener
接近 2 年之前 回复
leilba
leilba 要根据id来进行不同的操作,别忘了每个case下面加break
接近 2 年之前 回复
leilba
leilba onClick参数可以设置成一样的,再根据按钮的id来区分不同的按钮,在switch case里面分别处理不同的button事件也是可以的
接近 2 年之前 回复
Plantago
Plantago 也就是说我还是要find和setonclickListener
接近 2 年之前 回复
Plantago
Plantago layout里的onClick参数相同的话,只有第一个button有效
接近 2 年之前 回复
Plantago
Plantago 直接onclick是行的,可是我有多个button啊,如果我layout里的onClick参数不同的话,那么我岂不是要写多个public void x(View v){ }?
接近 2 年之前 回复
leilba
leilba 回复Plantago: layout和activity里面的方法名要对应起来,且监听的方法一定要写成public
接近 2 年之前 回复
leilba
leilba 回复Plantago:如果你在layout里面写的是onClick="onclick0"的话,则 SelectProvinceActivity里面有写需要写 public void onclick0(View view){//doSomeAction } 来监听的
接近 2 年之前 回复
Plantago
Plantago 01-27 11:05:24.109: E/AndroidRuntime(23832): Caused by: java.lang.NoSuchMethodException: onclick0 [class android.view.View]
接近 2 年之前 回复
Plantago
Plantago 你好,我按你的思路做的,报以下错是怎么回事呢?
接近 2 年之前 回复
Plantago
Plantago 01-27 11:05:24.109: E/AndroidRuntime(23832): java.lang.IllegalStateException: Could not find a method onclick0(View) in the activity class com.example.insurance.SelectProvinceActivity for onClick handler on view class android.widget.Button with id 'btn_pro0'
接近 2 年之前 回复
91program
91program   Ds   Rxr 2016.01.27 09:22

Button 的监听实现,多个按键可以是一个监听函数,然后根据 按键ID 来实现是哪个按键。

 start = (Button) findViewById(R.id.button1);  
stop = (Button) findViewById(R.id.button2);  
start.setOnClickListener(mylistener );  
stop.setOnClickListener(mylistener );  
View.OnClickListener mylistener = new View.OnClickListener() {  

        @Override  
        public void onClick(View v) {  
            switch (v.getId()) {  
            case R.id.button1:  
                Log.d(TAG, "Start to recorder video\n");  
                start_recorde();  
                break;  
            case R.id.button2:  
                Log.d(TAG, "Stop to recorder video\n");  
                stop_recorde();  
                break;  
            default:  
                break;  
            }     
        }  
    };  
xuzixiansheng
xuzixiansheng   2016.01.27 09:23

button的ID是都要设置的,但是你可以像做计算机一样利用数组,然后就可以一个声明一个数组button,里面包含多个id,等我去找找我曾经的源码给你看看啊。

xuzixiansheng
xuzixiansheng   2016.01.27 09:27

private Button[] btn = new Button[10]; 这是0-9按键

btn[0] = (Button) findViewById(R.id.zero);
btn[1] = (Button) findViewById(R.id.one);
btn[2] = (Button) findViewById(R.id.two);
btn[3] = (Button) findViewById(R.id.three);
btn[4] = (Button) findViewById(R.id.four);
btn[5] = (Button) findViewById(R.id.five);
btn[6] = (Button) findViewById(R.id.six);
btn[7] = (Button) findViewById(R.id.seven);
btn[8] = (Button) findViewById(R.id.eight);
btn[9] = (Button) findViewById(R.id.nine);
-------------
获取按键再xml文件上的ID;
也可以写成for循环简化下代码;

leilba
leilba   Rxr 2016.01.27 09:32

给你个我觉得挺简洁的方法,不需要findviewbyId,不需要在activity里面保存按钮对象,十分好用(反正我一直在用)。
在layout的button里面添加一个onClick参数,在activity里面直接实现OnClickListener接口,比如说:

////layout

         <Button
            android:id="@+id/btn_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:text="我是例子按钮"/>

////activity

//你的activity
public class MainActivity extends Activity implements View.OnClickListener {

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_test: { //按钮的点击
                        //do Actions
                        //你需要返回文本是吧
                        String text =( (Button)v).getText().toString();
                        //get到文本了

                        break;
                        }
                }
}

屡试不爽,反正我觉得方便多了。。当然如果在layout里面加了onClick参数的话,那么activity里面必须要实现onClickListener接口,不然会报错的。

希望你会喜欢
如果有更好的方法,也求推荐,,(*^__^*)

linxiaobo110
linxiaobo110   2016.01.27 11:09

每个BUTTON都有一个ID是必须的,但是多个按键可以用一个监听器。

Crazy_zihao
Crazy_zihao   2016.01.27 11:23

你可以使用一个时间监听器,然后只要是按钮选中的就getText(),没ID你没法绑定监听啊。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!