【问题标题】:How to get OnClick() from programmatically added buttons?如何从以编程方式添加的按钮中获取 OnClick()?
【发布时间】:2012-09-15 21:19:09
【问题描述】:

我添加了一些带有以下行的按钮:

for (int i=0; i<XML.size(); i++) {
//add button
ToggleButton b = new ToggleButton(this); 
// Setting the parameters
lefttextv.setLayoutParams(lleft); 
b.setLayoutParams(bright);
//customize button
    b.setOnClickListener(this);
b.setId(id_button);
System.out.println(id_button);
b.setHeight(100);
b.setWidth(200);
// Adding to the RelativeLayout as a child
layouth.addView(lefttextv);
layouth.addView(b);
    id_button++;  
    }

但是我怎样才能获得这些的 OnClick() 方法呢?我已经用这个方法实现了 View.OnClickListener:

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId())
    {
    case id_button: Log.d("Button 0","Button 0 pressed);
        break;
    }
}

但这不起作用,我如何获得ID?

【问题讨论】:

  • id_button 总是 0 吗?如果不是,为什么要在 case 语句中检查 0?下次考虑不要使用魔法常量。
  • 你不需要在某个时候调用 setOnClickListener 吗? (另外,我认为 setId 什么也不做)
  • 按钮的创建是在for循环中,并且创建了多个按钮。
  • 为什么不把 id_button 换成 i 呢?一个 id 应该是唯一的,而不是保持不变......

标签: android button onclick onclicklistener buttonclick


【解决方案1】:

b 是视图,如果您的 onClick 方法在您的主类中,只需使用 b.setOnClickListener(this); 并让您的活动实现 onClickListener 就可以了。或者按照通常的方式设置巡演听众。

id 用于 xml 引用,创建对象并使用此 id 进行引用,在您的情况下,您使用 ToggleButton 的所有属性创建了视图b。这是视图。

如果使用v.getId(),则只需使用if(v == b)

【讨论】:

  • 好的,但我使用 for 循环并创建更多按钮,但我不知道如何在我的 switch/case 语句中检查不同的 ID... switch (v.getId()){case R.id.id_button: Log.d("ONCLICK","Button gedrückt");} 是不可能的,因为我用这一行设置了 ID b.setId(id_button);
  • 将视图添加到 ArrayList... 使用视图组浏览它们并检查其中的 id。
  • 如果 id_button 是表示每个按钮的递增数字,为什么不直接使用 Log.d("Button " + v.getId());?
  • 我认为 ArrayList 是你最好的选择,因为每个按钮都有不同的功能
【解决方案2】:

只需使用b.setOnClickListener(this),其中this 指的是实现OnClickListener 的类。

编辑:

您可以使用 ID 资源来识别您的按钮。请参阅here 了解更多信息。您可以将这些 ID 分配给以编程方式生成的视图,并在您的 switch/case 语句中检查它们。

或者,正如@SmartLemon 所说,您只需检查if (v == b),然后您就不必为ID 烦恼了。

【讨论】:

  • 好的,这对于一个按钮来说效果很好,但我在 for 循环中创建了更多具有不同 ID 的按钮。我怎样才能意识到这一点?
  • 好的,但我不知道如何在我的 switch/case 语句中检查它们...switch (v.getId()){case R.id.id_button: Log.d("ONCLICK","Button gedrückt");} 是不可能的,因为我用这一行设置了 ID b.setId(id_button);
  • 您必须设置按钮的 ID 才能使用 ID 资源。这些是在您创建的 res/values/ids.xml 之类的文件中定义的。然后它们将出现在您的R.id 课程中。请参阅我提到的链接:developer.android.com/guide/topics/resources/…
  • 我已经创建了文件,它当然可以工作。但我不知道我必须创建多少个 ID,这取决于 for 循环,可以是 3 个或 10 个按钮......每个按钮都有不同的点击操作
  • 在这种情况下,您应该创建您可能需要的最大数量的 ID。
【解决方案3】:

当您在活动类中实现 onClickListener 时,您可以使用此关键字传递当前对象来为组件注册点击监听器。

class MyActivity extends Activity implements OnClickListener{
     private static final int id_button = 0;

     public void onCreate(Bundle b){
        //add button
        ToggleButton b = new ToggleButton(this); 
        // Setting the parameters
        lefttextv.setLayoutParams(lleft); 
        b.setLayoutParams(bright);
        //customize button
        b.setId(id_button);
        System.out.println(id_button);
        b.setHeight(100);
        b.setWidth(200);
        // Adding to the RelativeLayout as a child
        layouth.addView(lefttextv);
        layouth.addView(b);
        b.setOnClickListener(this);
     }

     @Override
     public void onClick(View v) {
        // TODO Auto-generated method stub
       switch (v.getId()){
       case 0: Log.d("Button 0","Button 0 pressed);
            break;
       }
    }
}

【讨论】:

    【解决方案4】:

    您已将button 中的id 设置为id_button 对吗?

    添加onCreate方法:

     b1.setOnClickListener(this);    
    

    在 onClick 方法中使用该 id,如下所示:

    @Override
     public void onClick(View v) {
        // TODO Auto-generated method stub
        if(v.getId() == R.id.id_button)
        {
        Log.d("Button 0","Button 0 pressed);
            break;
        }
    }
    

    【讨论】:

    • R 文件是生成文件,在运行时生成,他不使用 R.id.id_button 他使用 id_button。它只是一个局部变量。
    • 他必须使用 id。是的,我知道 R 是一个生成的文件。但他可以使用 R.id。没有问题,因为 id 在用户点击按钮之前存储在 R 中......
    • 但是他已经有了局部变量......如果为已经存在的东西引用另一个文件是愚蠢的。这就引出了下一个事实,当您可以将 v 与 b 进行比较时,为什么还要使用 v.getId 和 b.getId?
    • 如果条件破?
    【解决方案5】:

    改成这样..

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        int i= b.getId();
        switch (v.getId())
        {
            case i:
                Log.d("Button 0","Button 0 pressed");
                break;
        }
    }
    

    【讨论】:

    • 这里 b 应该在 OnCreate() 之外声明以获得访问权限:)
    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 2012-06-20
    相关资源
    最近更新 更多