3

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

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

4 回答 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++;
}
于 2012-03-19T11:01:08.410 回答
3

for循环结束后,btn指的是最后创建的按钮,而不是全部。每次你都btn = new Button(...)失去了之前的值btn

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

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

于 2012-03-19T10:33:26.483 回答
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++;
    }

干杯,
尤维

于 2012-03-19T10:39:50.880 回答
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)。

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

于 2012-03-19T10:51:22.757 回答