【问题标题】:Android: Dynamicly add OnClickListeners to ButtonsAndroid:将 OnClick 侦听器动态添加到按钮
【发布时间】:2012-02-21 19:15:29
【问题描述】:

在我的活动中,我查看了一个 SQLite 数据库(_id、名称、编号)并添加了与数据库中的行一样多的按钮。对于每个按钮,我动态创建 onClickListener,它将启动另一个活动,我需要将来自对应数据库行的数据传递到该活动中。我的代码如下:

db.open();
String name;
String number;
Cursor c = db.getAllContacts();
c.moveToFirst();
int count = db.getCount();
for (int i = 0; i < count; i++) {
    ImageButton button = new ImageButton(this);
    name = c.getString(1);
    number = c.getString(2);
    button.setOnClickListener(new onClickListener() {
       public void onClick(View v) {
          Intent intent = new Intent(This_class.this, Other_class.class);
          intent.putExtra("name_bundle", name);
          intent.putExtra("number_bundle", number);
          startActivity(intent);
       }
    });
c.moveToNext();
}
db.close();

在由 ImageButton 启动的新 Activity 中,我处理传递的数据,如下所示:

Bundle extras = getIntent().getExtras();
name = extras.getString("name_bundle");
number = extras.getString("number_bundle");

所有按钮都正确创建,但我的问题是它们都传递相同的信息。我的意图是,当单击第三个按钮时,将传递来自数据库第三行的数据(代码中的第 1 列和第 2 列)(在新启动的 Activity 中,我将它们显示在 TextView 中)。但是发生的情况是所有按钮都传递相同的数据!准确地说,来自数据库最后一行的数据。当我尝试向数据库添加另一行时,创建了一个额外的按钮,并且所有按钮再次显示来自数据库新创建的(因此是最后一个)行的相同数据。我怀疑我的代码中存在错误或完全错误的方法。有任何想法吗?谢谢!!

【问题讨论】:

  • 在 onClickListener 实现之前创建意图,然后使用 button.setTag(intent); 为所有按钮制作 ONE(fx.: as class field) OnClickListener 实现:static final OnClickListener listener = new OnClickListener() { public void onClick(View v) { startActivity((Intent)v.getTag()); } 然后将其设置为按钮 button.setOnClickListener(listener);
  • 无论如何......你正在重新投资 ListView
  • ...您也可以尝试将name 和number 声明IN for 循环范围(范围我的意思是“{}”或拳头表达式) 并在那里使 em final ...
  • 我不太明白这段代码的作用,但它完全有效:) 我使用了你发布的第一种方法,这真的很有帮助,谢谢!!!! :)
  • 提示:View v 是被点击的按钮,因为 Button 是 View 的子类 ... 只需将意图作为视图的标签并在 onClick 中恢复 ....

标签: android android-intent bundle


【解决方案1】:

在您的新活动中使用removeExtra()

Bundle extras = getIntent().getExtras();
name = extras.getString("name_bundle");
number = extras.getString("number_bundle");
getIntent().removeExtra("name_bundle");
getIntent().removeExtra("number_bundle");

当您开始活动时,旧的附加功能不会被新的替换。

【讨论】:

  • 我添加了这两行,但它没有解决问题。我仍然只得到最后一行的数据。但奇怪的是,当旧的临时演员没有被替换时,为什么我只看到最后一行数据?我应该只看到第一行数据,因为第一个按钮被分配为第一个监听器,对吧?
  • 嘿...你们俩都应该阅读匿名接口实现中的本地变量String name; String number;是本地人...并且在“光标行”的最后一次迭代之后有一些值...然后这个(最后) 值用于 OnClickListener 的所有匿名接口实现
  • 是的,我想我明白了。由于仅在单击按钮时才调用侦听器方法,因此它使用我给它的变量,但这些变量已经设置为最后一个数据库行中的值。更改此循环中的值完全没有意义……您有什么建议可以解决这个问题吗?
  • 这是本地 var 作用域的问题...在您的问题下查看我的 cmets
  • 可能会为每个按钮分配带有 button.setId (button0,1,...) 的 ID,当单击按钮时,从 ID 中解析数字并根据数字使用数据库中的数据?
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多