Распознавание кнопки из динамического представления

1

Я написал этот код для динамического макета, где я использую этот цикл для создания пары кнопок (это часть кода, где я их генерирую)

  for(int i = 1; i <= 2 ; i++) {
        Button button1 = new Button(this);
        button1.setTag("age");
        button1.setId(i);
        layout.addView(button1);

        Button button2 = new Button(this);
        button2.setId(i);
        button2.setTag("country");
        button2.setEnabled(false);
        layout.addView(button2);

        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
       }

То, что я хочу сделать, это нажать кнопку1, кнопка2 должна быть включена (изначально она отключена).

Это была бы очень простая задача, если бы кнопки были созданы в xml, так как тогда у них будут отдельные имена R.id.xxxxx для каждого, но здесь я не могу понять, как обнаружить другую кнопку в OnClick (View v), так что я могу изменить, если он включен или нет, я попытался добавить тег для каждой кнопки, чтобы у меня был другой параметр для распознавания кнопок, но я понятия не имею, как распознать другую кнопку с информацией о представлении нажата кнопка1.

Теги:
button
dynamic

2 ответа

2
Лучший ответ

Я предполагаю, что вы используете теги кнопок в обработке кликов. Чтобы сохранить данные тегов и добавить необходимую проводку между кнопками, вы можете создать структуру данных, которая будет служить тегом:

static class ButtonTag {
    String buttonType;
    Button partner;
    ButtonTag(String type, Button button) {
        buttonType = type;
        partner = button;
    }
}

Затем вы можете реорганизовать свой установочный код:

for(int i = 1; i <= 2 ; i++) {
    Button button1 = new Button(this);
    button1.setId(i);
    layout.addView(button1);

    Button button2 = new Button(this);
    button2.setId(i);
    button2.setEnabled(false);
    button1.setTag(new ButtonTag("age", button2));
    button2.setTag(new ButtonTag("country", button1));
    layout.addView(button2);
}

Очевидно, что обработка кликов должна быть заменена на getTag() на ButtonTag вместо String.

Если вам не нужна информация о возрасте и стране, чтобы различать типы кнопок, просто установите каждую кнопку в качестве метки для другого.

РЕДАКТИРОВАТЬ:

С последней схемой, вот как вы могли бы использовать это в прослушивателе кликов:

public void onClick(View v) {
    Object tag = v.getTag();
    if (tag instanceof Button) {
        Button btn = (Button) tag;
        btn.setEnabled(true);
        v.setEnabled(false);
    }
}

Если вам понадобилась часть "возраст" и "страна" тега по другим причинам, код был бы немного другим:

public void onClick(View v) {
    Object tag = v.getTag();
    if (tag instanceof ButtonTag) {
        ButtonTag bTag = (ButtonTag) tag;
        bTag.partner.setEnabled(true);
        v.setEnabled(false);
    }
}
  • 0
    Спасибо, сэр .... но я до сих пор не понимаю, как распознать другую кнопку, .... не могли бы вы сказать мне, что должно быть написано в слушателе onClick, чтобы при нажатии кнопки 1 кнопка 2 включалась.
  • 0
    Тед Я разместил ответ ниже, как вы думаете, этот ответ в порядке?
Показать ещё 2 комментария
2

Я получил решение проблемы после обращения к этому вопросу здесь (найти кнопку по ID или TAG), она решает проблему, с которой я столкнулся как таковой!

public class DynmaicViewExperimentActivity extends Activity implements OnClickListener{

List<Button> buttons;

@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        buttons = new ArrayList<Button>();
        setDynamicContentViewOfThisPage();
    }

public void onClick(View v) {
    // TODO Auto-generated method stub
    int buttonType = 0;
    if (v.getTag()=="age")
            buttonType = 1;
    else if (v.getTag()=="country")
            buttonType = 2;
    switch (buttonType) {
        case 1:
            for(Button b: buttons) {
                if(b.getId() == v.getId() && b.getTag().equals("country")){
                    b.setEnabled(true);
                    v.setEnabled(false);
                    }
        case 2:
            for(Button b: buttons) {
                if(b.getId() == v.getId() && b.getTag().equals("age")){
                    b.setEnabled(true);
                    v.setEnabled(false);
                    }
                }
            }
        }


private void setDynamicContentViewOfThisPage() {
    // Defining the Scroll View and the LinearLayout
    ScrollView sv = new ScrollView(this);
    LinearLayout l = new LinearLayout(this);
    l.setOrientation(LinearLayout.VERTICAL);
    sv.addView(l);

                                for(int i = 1; i <= 2 ; i++) {

                                  Button button1 = new Button(this);
                                  button1.setId(i);
                                  button1.setTag("age");
                                  buttons.add(button1);
                                  l.addView(button1);

                                  Button button2 = new Button(this);
                                  button2.setId(i);
                                  button2.setTag("country");
                                  buttons.add(button2);
                                  l.addView(button2);

                                  button.setOnClickListener(this);
                                  button2.setOnClickListener(this);

    // Set the content View to this
        this.setContentView(sv);
    }
   }
 }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню