在Android中获取以编程方式生成的按钮网格的编号
问题描述:
我有一个类似的查询以发布here。我创建了一个由可变数量的按钮组成的网格,在运行时(在TableLayout中),并希望找到按下按钮的索引。实际的Button对象当前存储在一个数组中,但我不确定这是否真的有必要。我试着用ClickListener写一些东西:在Android中获取以编程方式生成的按钮网格的编号
public void onClick(View view) {
Button clickedButton = (Button) view;
int buttonID = clickedButton.getId();
但是这只是总是返回-1。没有预先定义xml中的按钮,是否有可能获得id(或按下其他按钮的引用)?
另一篇文章中的解决方案描述了循环遍历整个按钮数组和比较id。有没有更优雅的方式来做到这一点?
答
鉴于您有参考资料,您不需要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);
}
答
如果有人需要这个,我更喜欢这样做。监听器也是一个类,所以你可以为它创建实例变量。
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
。
谢谢,这正是我正在寻找的。 – Hemmer 2010-06-28 15:26:44