Задний план

Я динамически создаю кнопки в цикле for, следуя решению Pragnesh Ghota по одному прослушивателю onClick для каждой кнопки в формате < a href = "http://android.okhelp.cz/create-button-dynamically-android-sample/" rel = "nofollow noreferrer"> решение для индивидуальной инициализации dymmeh :

LinearLayout someLayout = (LinearLayout) findViewById(R.id.theRoom);
    for (int i = 0; i < neededButtons.length; i++){
        neededButtons[i] = new Button(this);
        neededButtons[i].setText(names[i]);
        neededButtons[i].setOnClickListener(this);
        LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
        );
    }

Кроме того, я создаю один прослушиватель onClick, реализуя View.OnClickListener в классе actvity. Мой класс определяется так:

public class RecallActivity extends AppCompatActivity implements View.OnClickListener{
    ...
}

Я с успехом следовал за другими шагами решения Прагнеш Гхоты. Однако...

Проблема

На четвертом шаге решения Прагнеш Гхоты упоминается использование оператора case для проверки, нажата ли какая-либо из кнопок. Это работает, когда количество кнопок известно. Однако, поскольку я придерживаюсь формата, изложенного в решении dymmeh, я не знаю, сколько кнопок я проверяю до выполнения время.

Вопрос

Как сделать оператор потока управления в методе переопределения onClick для динамического количества кнопок?

0
isakbob 24 Фев 2018 в 02:40

3 ответа

Лучший ответ

Просто создайте новый OnClickListener для каждой кнопки при их создании.

LinearLayout someLayout = (LinearLayout) findViewById(R.id.theRoom);
for (int i = 0; i < neededButtons.length; i++){
    neededButtons[i] = new Button(this);
    neededButtons[i].setText(names[i]);
    neededButtons[i].setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // add your click listener code here
                    }
                })
    LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.FILL_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT
    );
}
1
squeeish 24 Фев 2018 в 00:03

Вы можете установить id для кнопки. Просто так:

LinearLayout someLayout = (LinearLayout) findViewById(R.id.theRoom);
for (int i = 0; i < neededButtons.length; i++){
    neededButtons[i] = new Button(this);
    neededButtons[i].setText(names[i]);
    neededButtons[i].setId(i);
    neededButtons[i].setOnClickListener(this);
    ...
    ); 
}

Затем найдите представление по id в OnClickListener. например:

public class RecallActivity extends AppCompatActivity implements View.OnClickListener{
  @overide
  public void onClick(View view){
     if(view.getId == 0){
        .....
   }
 }
}
0
abby 24 Фев 2018 в 01:44

Самым простым решением является использование setTag и getTag для ваших кнопок. Вы можете использовать объект с setTag и getTag. Всякий раз, когда вы создаете кнопку, установите для нее тег:

for (int i = 0; i < neededButtons.length; i++){
    neededButtons[i] = new Button(this);
    neededButtons[i].setText(names[i]);
    neededButtons[i].setTag(names[i]);
    // or you can use the index as the tag with:
    // neededButtons[i].setTag(i);
    neededButtons[i].setOnClickListener(this);
}

Затем вы делаете что-то для каждой кнопки, проверяя тег:

@Override
public void onClick(View v) {
    doSomething(v.getTag());
}

private void doSomething(Object tag) {
  // in case your tag is the index, than you can convert it to 
  // integer and use switch case
  int index = (int) tag;
  switch(index) {
    case 1:
      ...
      break;
    case 2:
      ...
      break;
    ...
  }
}
0
ישו אוהב אותך 24 Фев 2018 в 02:56