OnClickListener() 用于动态数量的按钮

Posted

技术标签:

【中文标题】OnClickListener() 用于动态数量的按钮【英文标题】:OnClickListener() for dynamic amount of buttons 【发布时间】:2018-02-23 23:40:18 【问题描述】:

背景

我正在通过Pragnesh Ghota's solution of one onClick listener for every button 以dymmeh's individual initialization solution 的格式在for 循环中动态创建按钮:

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
        );
    

此外,我通过在活动类中实现 View.OnClickListener 来制作one onClick listener。我的班级是这样定义的:

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

我已经按照Pragnesh Ghota's solution 的其他步骤成功了。不过……

问题

Pragnesh Ghota's solution 的第四步提到使用 case 语句来检查是否有任何按钮被点击。当按钮数量已知时,此方法有效。但是,由于我遵循dymmeh's solution 中列出的格式,所以在执行之前我不知道要检查多少个按钮。

问题

如何在重写的 onClickMethod 中为动态数量的按钮执行控制流语句?

【问题讨论】:

【参考方案1】:

在创建每个按钮时,只需为每个按钮创建一个新的 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
    );

【讨论】:

【参考方案2】:

你可以为按钮设置一个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);
    ...
    ); 

然后在OnClickListener 中按id 查找视图。例如:

public class RecallActivity extends AppCompatActivity implements View.OnClickListener
  @overide
  public void onClick(View view)
     if(view.getId == 0)
        .....
   
 

【讨论】:

【参考方案3】:

最简单的解决方案是为您的按钮使用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;
    ...
  

【讨论】:

以上是关于OnClickListener() 用于动态数量的按钮的主要内容,如果未能解决你的问题,请参考以下文章

SQL FIFO库存查询用于老化一个动态的单位数量

如何跟踪视图行的 ArrayList 的动态索引

我可以从侦听器内部引用 OnClickListener 的按钮吗? (安卓)

在 listview Android 1.6 中同时使用 onClickListener 和 onLongClickListener

如何使用过滤的 RecyclerView 和 OnClickListener 从 ArrayList 中删除项目

使用 R/Shiny 创建动态数量的输入元素