我对发布的here提出了类似的查询。我在运行时(在TableLayout中)创建一个由可变数量的按钮组成的网格,并希望找到按下的按钮的索引。实际的Button对象当前存储在一个数组中,虽然我不确定这是否真的有必要。我尝试使用以下内容编写ClickListener:
public void onClick(View view) {
Button clickedButton = (Button) view;
int buttonID = clickedButton.getId();
但这总是返回-1。是否可以在不预定义xml中的按钮的情况下获取id(或按下按钮的其他参考)?
另一篇文章中的解决方案描述了在整个按钮阵列中循环并比较id。有更优雅的方式吗?
答案 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
每次都被覆盖