在Android中获取以编程方式生成的按钮网格的ID

时间:2010-06-28 13:41:45

标签: android layout

我对发布的here提出了类似的查询。我在运行时(在TableLayout中)创建一个由可变数量的按钮组成的网格,并希望找到按下的按钮的索引。实际的Button对象当前存储在一个数组中,虽然我不确定这是否真的有必要。我尝试使用以下内容编写ClickListener:

public void onClick(View view) {

       Button clickedButton = (Button) view;
               int buttonID = clickedButton.getId();

但这总是返回-1。是否可以在不预定义xml中的按钮的情况下获取id(或按下按钮的其他参考)?

另一篇文章中的解决方案描述了在整个按钮阵列中循环并比较id。有更优雅的方式吗?

3 个答案:

答案 0 :(得分:1)

您可以按this method手动为动态创建的小部件设置ID。

答案 1 :(得分:0)

鉴于您有参考资料,您不需要ID。

    final Button b1 = new Button(this);
    final Button b2 = new Button(this);
    final Button b3 = new Button(this);
    Button[] buttons = new Button[] { b1, b2, b3 };
    OnClickListener listener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (v == b1) {
                // TODO
            } else if (v == b2) {
                // TODO
            } else if (v == b3) {
                // TODO
            }
        }
    };
    for (Button b : buttons) {
        b.setOnClickListener(listener);
    }

答案 2 :(得分:0)

如果有人需要这个,这就是我喜欢做的事情。监听器也是一个类,因此您可以为它创建实例变量。

new Listener(id) {

  private int id;

  public Listener(int id) {
    this.id = id;
  }

  private void onClick(View view) {        
    buttonID = id;
  }

}

其中buttID在侦听器之外声明。通过将类外部的侦听器作为单独的类移动来避免内存泄漏,可以改进此解决方案。

处理leakfree侦听器的另一种方法是将侦听器定义为嵌套类,方法是在包含类中声明它public/private static class Listener,但这会导致int id每次都被覆盖