Я написал этот код для динамического макета, где я использую этот цикл для создания пары кнопок (это часть кода, где я их генерирую)
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.
Я предполагаю, что вы используете теги кнопок в обработке кликов. Чтобы сохранить данные тегов и добавить необходимую проводку между кнопками, вы можете создать структуру данных, которая будет служить тегом:
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);
}
}
Я получил решение проблемы после обращения к этому вопросу здесь (найти кнопку по 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);
}
}
}