实现按钮监听器循环的问题

时间:2021-12-12 08:36:42
我定义了一个成员函数,用来实现按钮的监听器
因为按钮比较多,所以用了一个for循环
但是总是运行错误
好像是这个函数出问题 public void onClick(View v)

但是如果我不用for循环,把这25个监听器拿到for外面实现,就没有问题
不知这是什么原因,请大虾指教

    public void SetOnClickListener() {
    
     for (mClickIndex = 0; mClickIndex < 25; mClickIndex++) {
     mButton[mClickIndex].setOnClickListener(new Button.OnClickListener() {
     public void onClick(View v) {
             if (mStage_num == mButton_num[mClickIndex]) {
             mStage_num ++;
                     stage_num_text.setText("touch >>> " + String.valueOf(mStage_num));
             } else {
             // error
             }
             }
            });
     }
    }

12 个解决方案

#1


我的代码是能够正常工作的。
        mButton = new Button[4];
        mButton[0] = (Button)findViewById(R.id.button1);
        mButton[1] = (Button)findViewById(R.id.button2);
        mButton[2] = (Button)findViewById(R.id.button3);
        mButton[3] = (Button)findViewById(R.id.button4);
        
        for(int i = 0; i < 4; i++){
            mButton[i].setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                // TODO Auto-generated method stub
                    Log.i("test", "" + v.getId());
                
                }
            });
        }


希望能提供一下log分析下,初步认为是mClickIndex的值被修改,越界了。

#2


谢谢你的回答
但是不知有否运行程序?
因为有点怀疑
for循环里的变量i好像传不到mButton[i].setOnClickListener()里面去
必须要定义成成员变量或者全局变量

引用 1 楼 yyy025025025 的回复:
我的代码是能够正常工作的。

Java code
        mButton = new Button[4];
        mButton[0] = (Button)findViewById(R.id.button1);
        mButton[1] = (Button)findViewById(R.id.button2);
        mButton[2] = (……

#3


程序我是运行过的  并且有log打印出来

#4


LZ说的那个应该不会的!
  看看会不会是数组越界的问题哦

#5


引用 1 楼 yyy025025025 的回复:
我的代码是能够正常工作的。

Java code
        mButton = new Button[4];
        mButton[0] = (Button)findViewById(R.id.button1);
        mButton[1] = (Button)findViewById(R.id.button2);
        mButton[2] = (……


你的代码确实是没有问题的,但是你试着往public void onClick(View v) {}里面传个参数,
比如说把for循环的i传进去,就会有问题了

#6


引用楼主 qijun83 的回复:
我定义了一个成员函数,用来实现按钮的监听器
因为按钮比较多,所以用了一个for循环
但是总是运行错误
好像是这个函数出问题 public void onClick(View v)

但是如果我不用for循环,把这25个监听器拿到for外面实现,就没有问题
不知这是什么原因,请大虾指教

  public void SetOnClickListener() {
 
  for (……


知道错误所在了,监听到按钮,传到public void onClick(View v) {}里面的mClickIndex都已经变成25了,数组必然越界了。因为onClick(View v)这个函数要等监听之后才执行

#7


大家有没有办法把没有变化之前的mClickIndex传到onClick(View v)里面去
就是说不同按钮onClick(View v)里面的mClickIndex对应各自的检索值

#8


我现在也有同样的问题,监听器只执行循环的最后一个按钮

#9


貌似最简单的方法是一个button做一个监听函数, 不然真没办法区分处理监听函数里面处理的是哪个button

#10


引用 2 楼 qijun83 的回复:
谢谢你的回答
但是不知有否运行程序?
因为有点怀疑
for循环里的变量i好像传不到mButton[i].setOnClickListener()里面去
必须要定义成成员变量或者全局变量

引用 1 楼 yyy025025025 的回复:
我的代码是能够正常工作的。

Java code
mButton = new Button[4];
mButton[0] = (Butto……


i传不进去和变量的作用域有关系吧~
用全局变量也不能解决你的问题
除非能知道当前被按下button类似id的东西

#11


今天看了个帖子,貌似有解决方法,不知LZ是不是已经发现了
http://blog.csdn.net/Android_Tutor/archive/2010/07/16/5740845.aspx

    sButton.setOnClickListener(this);   //两个button设同一个listen
    pButton.setOnClickListener(this);   

    //铵钮点击事件响应   
    public void onClick(View v) {   
        if(v == sButton){   
            SerializeMethod();   
        }else{   
            PacelableMethod();   
        }   
    }   

#12


mClickIndex确实传不进,除非是包含该类的类的一个属性。我也碰到过这种问题。。。

#1


我的代码是能够正常工作的。
        mButton = new Button[4];
        mButton[0] = (Button)findViewById(R.id.button1);
        mButton[1] = (Button)findViewById(R.id.button2);
        mButton[2] = (Button)findViewById(R.id.button3);
        mButton[3] = (Button)findViewById(R.id.button4);
        
        for(int i = 0; i < 4; i++){
            mButton[i].setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                // TODO Auto-generated method stub
                    Log.i("test", "" + v.getId());
                
                }
            });
        }


希望能提供一下log分析下,初步认为是mClickIndex的值被修改,越界了。

#2


谢谢你的回答
但是不知有否运行程序?
因为有点怀疑
for循环里的变量i好像传不到mButton[i].setOnClickListener()里面去
必须要定义成成员变量或者全局变量

引用 1 楼 yyy025025025 的回复:
我的代码是能够正常工作的。

Java code
        mButton = new Button[4];
        mButton[0] = (Button)findViewById(R.id.button1);
        mButton[1] = (Button)findViewById(R.id.button2);
        mButton[2] = (……

#3


程序我是运行过的  并且有log打印出来

#4


LZ说的那个应该不会的!
  看看会不会是数组越界的问题哦

#5


引用 1 楼 yyy025025025 的回复:
我的代码是能够正常工作的。

Java code
        mButton = new Button[4];
        mButton[0] = (Button)findViewById(R.id.button1);
        mButton[1] = (Button)findViewById(R.id.button2);
        mButton[2] = (……


你的代码确实是没有问题的,但是你试着往public void onClick(View v) {}里面传个参数,
比如说把for循环的i传进去,就会有问题了

#6


引用楼主 qijun83 的回复:
我定义了一个成员函数,用来实现按钮的监听器
因为按钮比较多,所以用了一个for循环
但是总是运行错误
好像是这个函数出问题 public void onClick(View v)

但是如果我不用for循环,把这25个监听器拿到for外面实现,就没有问题
不知这是什么原因,请大虾指教

  public void SetOnClickListener() {
 
  for (……


知道错误所在了,监听到按钮,传到public void onClick(View v) {}里面的mClickIndex都已经变成25了,数组必然越界了。因为onClick(View v)这个函数要等监听之后才执行

#7


大家有没有办法把没有变化之前的mClickIndex传到onClick(View v)里面去
就是说不同按钮onClick(View v)里面的mClickIndex对应各自的检索值

#8


我现在也有同样的问题,监听器只执行循环的最后一个按钮

#9


貌似最简单的方法是一个button做一个监听函数, 不然真没办法区分处理监听函数里面处理的是哪个button

#10


引用 2 楼 qijun83 的回复:
谢谢你的回答
但是不知有否运行程序?
因为有点怀疑
for循环里的变量i好像传不到mButton[i].setOnClickListener()里面去
必须要定义成成员变量或者全局变量

引用 1 楼 yyy025025025 的回复:
我的代码是能够正常工作的。

Java code
mButton = new Button[4];
mButton[0] = (Butto……


i传不进去和变量的作用域有关系吧~
用全局变量也不能解决你的问题
除非能知道当前被按下button类似id的东西

#11


今天看了个帖子,貌似有解决方法,不知LZ是不是已经发现了
http://blog.csdn.net/Android_Tutor/archive/2010/07/16/5740845.aspx

    sButton.setOnClickListener(this);   //两个button设同一个listen
    pButton.setOnClickListener(this);   

    //铵钮点击事件响应   
    public void onClick(View v) {   
        if(v == sButton){   
            SerializeMethod();   
        }else{   
            PacelableMethod();   
        }   
    }   

#12


mClickIndex确实传不进,除非是包含该类的类的一个属性。我也碰到过这种问题。。。