动态设置setOnClickListener

3

I create different buttons dynamically like this:

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个回答

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++;
}

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


这个回复与Hiral的回复非常相似。他先发表了,因此“被采纳的答案”归给了他。抱歉。 - anonymous
@KrLx_roller 没关系。虽然我刚刚看了一下发布时间,实际上我比他先回答了..:)但无论如何,我很高兴你解决了问题。 - YuviDroid

3
for循环结束后,btn仅指向最后一个创建的按钮,而不是所有按钮。每次执行btn = new Button(...)时,都会丢失btn的先前值。
由于你是在for循环外设置点击监听器,因此只有最后一个按钮得到了该处理程序。为使所有按钮正常工作,需要在for循环内部设置监听器。
在这种情况下,通常不会将switch放在一个函数中并将所有对象的监听器设置为该函数,而是创建一个通用函数,并将每个对象的点击监听器设置为围绕该函数的委托,该委托传递额外参数到通用函数以确定应执行什么操作。

谢谢您的解释。我本来就猜想我的错误可能是那个,但我不确定。 - anonymous

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

我可以在循环(final)内部初始化新视图,并向其添加新的监听器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接