动态setOnClickListener

时间:2012-03-19 10:29:39

标签: android button listener onclicklistener

我动态创建不同的按钮:

for (int toShow = 1; toShow <= nShips; toShow++)
    {
        btn = new Button(this);
        btn.setBackgroundResource(shipDrawable.get(ima));
        btn.setLayoutParams(params);
        row[pos].addView(btn);
        btn.setId(shipId.get(ima));
        if (row[pos].getChildCount() == 3) pos++;
        ima++;
    }

我需要知道每个按钮的身份,因为彼此有不同的动作。然后,我尝试像这样设置onClickListener

btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View btn) {
            switch(btn.getId()){
                case 1000: System.out.println("FIRST");
                break;

                case 1004: System.out.println("FOURTH");
                break;
            }
        }
    });

但它不起作用。似乎onClickListener仅影响最后创建的项目。如果我创建了四个按钮,则只有第四个按钮会有onClickListener

如何让我的点击听众工作?

4 个答案:

答案 0 :(得分:5)

你可以这样做:

OnClickListener clicks=new OnClickListener() {

    @Override
    public void onClick(View v) {

            switch(v.getId())
            {
                case 1000: System.out.println("FIRST");
                break;

                case 1004: System.out.println("FOURTH");
                break; 
            }       
    }
};
for (int toShow = 1; toShow <= nShips; toShow++)
{
        btn = new Button(this);
        btn.setBackgroundResource(shipDrawable.get(ima));
        btn.setLayoutParams(params);
        row[pos].addView(btn);
        btn.setId(shipId.get(ima));
        btn.setOnClickListener(clicks);
        if (row[pos].getChildCount() == 3) pos++;
        ima++;
}

答案 1 :(得分:4)

for循环结束后,btn指的是创建的最后一个按钮,而不是所有按钮。每次执行btn = new Button(...)时,您都会丢失btn的先前值。

由于您在for循环之外设置了单击侦听器,因此只有最后一个按钮才能获得该处理程序。要使所有按钮都起作用,您需要将侦听器设置在 for for循环中。

在这种情况下,不是将switch放在一个函数中并将所有对象的侦听器设置为该函数,而是通常创建一个通用函数并将每个对象的单击侦听器设置为围绕该函数的委托。将额外参数传递给常规函数以确定应该执行的操作的函数。

答案 2 :(得分:3)

你可以这样做:

OnClickListener listener = new OnClickListener() {
            @Override
            public void onClick(View btn) {
                switch(btn.getId()){
                    case 1000: System.out.println("FIRST");
                    break;

                    case 1004: System.out.println("FOURTH");
                    break;
                }
            }
        };

for (int toShow = 1; toShow <= nShips; toShow++) {
        btn = new Button(this);

        // Set the click listener to all your buttons
        btn.setOnClickListener(listener);

        btn.setBackgroundResource(shipDrawable.get(ima));
        btn.setLayoutParams(params);
        row[pos].addView(btn);
        btn.setId(shipId.get(ima));
        if (row[pos].getChildCount() == 3) pos++;
        ima++;
    }

干杯,
Yuvi

答案 3 :(得分:0)

                  for (Answer a : q.getAnswers()) {
                        final CheckBox cb = new CheckBox(this);
                        cb.setId(Integer.valueOf(a.getId()));
                        cb.setText(a.getValue());
                        cb.setTextColor(fontColor);
                        cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                            @Override
                            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                                // TODO Auto-generated method stub
                                if(isChecked){
                                    inviCheckox.append("-"+String.valueOf(buttonView.getId()));
                                }

                        });
                        lCheckList.addView(cb);
                    }

我尝试使用这样的代码并且它正在运行(API Lv 10)。

我可以在循环内部(最终)初始化新的View,只需添加新的监听器