【问题标题】:setOnClickListener dynamically动态设置OnClickListener
【发布时间】:2012-04-03 20:15:25
【问题描述】:

我像这样动态创建不同的按钮:

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

如何让我的点击监听器工作?

【问题讨论】:

    标签: android button listener onclicklistener


    【解决方案1】:

    你可以这样做:

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

    【讨论】:

    • @KrLx_roller:很高兴为您提供帮助。 :)
    【解决方案2】:

    你可以这样做:

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

    干杯,
    尤维

    【讨论】:

    • 此回复与 Hiral 的回复非常相似。他先发帖,所以“接受的答案”发给了他。对不起
    • @KrLx_roller 没关系。虽然我只是查看了发布时间,实际上我在他面前发布了答案..:) 但无论如何,我很高兴你解决了你的问题。
    【解决方案3】:

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

    由于您在for 循环之外设置点击侦听器,因此只有最后一个按钮会获取该处理程序。为了让所有按钮都能正常工作,您需要将侦听器设置在 inside for 循环中。

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

    【讨论】:

    • 感谢您的解释。我以为我的错误就是那个,但我不确定。
    【解决方案4】:
                      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)。

    我可以在循环(最终)内初始化新视图,然后添加新的监听器

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多