setOnClickListener динамически - PullRequest
3 голосов
/ 19 марта 2012

Я создаю разные кнопки динамически, как это:

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 голосов
/ 19 марта 2012

Вы можете сделать как:

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++;
}
4 голосов
/ 19 марта 2012

После окончания цикла for, btn относится к последней созданной кнопке, а не ко всем из них. Каждый раз, когда вы делаете btn = new Button(...), вы теряете предыдущее значение btn.

Поскольку вы устанавливаете прослушиватель щелчков вне цикла for, этот обработчик получает только последняя кнопка. Чтобы все кнопки работали, вам нужно установить слушателя внутри для цикла.

И в таких случаях вместо помещения switch в одну функцию и установки прослушивателя всех объектов на эту функцию, вы обычно создаете общую функцию и устанавливаете прослушиватель щелчка каждого объекта на делегата вокруг этой функции, который передает дополнительные аргументы в общую функцию, чтобы определить, что должно быть сделано.

3 голосов
/ 19 марта 2012

Вы можете сделать это:

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

0 голосов
/ 19 марта 2012
                  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).

Я могу инициировать новый Просмотр внутри цикла (финал) и просто добавить новый слушатель к нему

...