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

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

问题描述:

我有一个类似的查询以发布here。我创建了一个由可变数量的按钮组成的网格,在运行时(在TableLayout中),并希望找到按下按钮的索引。实际的Button对象当前存储在一个数组中,但我不确定这是否真的有必要。我试着用ClickListener写一些东西:在Android中获取以编程方式生成的按钮网格的编号

public void onClick(View view) { 

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

但是这只是总是返回-1。没有预先定义xml中的按钮,是否有可能获得id(或按下其他按钮的引用)?

另一篇文章中的解决方案描述了循环遍历整个按钮数组和比较id。有没有更优雅的方式来做到这一点?

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

+0

谢谢,这正是我正在寻找的。 – Hemmer 2010-06-28 15:26:44

鉴于您有参考资料,您不需要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); 
    } 
+0

因此,对于一个大网格(说10x10),你只需要使用for循环,并通过检查参考循环?我是否应该担心这种性能受到影响?谢谢你的帮助。 – Hemmer 2010-06-28 14:23:19

+0

这种检查应该非常快。 – yanchenko 2010-06-28 14:44:53

如果有人需要这个,我更喜欢这样做。监听器也是一个类,所以你可以为它创建实例变量。

new Listener(id) { 

    private int id; 

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

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

} 

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

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