【问题标题】:Adding different onClickListener to dynamically creataed Views为动态创建的视图添加不同的 onClickListener
【发布时间】:2016-05-05 05:27:24
【问题描述】:

我正在创建一个 android 应用程序,我在其中动态创建 2 个 imageViews 和 2 个按钮,并且我想将 onClickListeners 分配给它们,并且我想为它们中的每一个执行不同的功能。我在整个互联网上进行了搜索,但没有关于如何使视图在点击时发挥其自身功能的信息。

到目前为止,我想出了这个:

    /* Setting the ids */
    leftImageView.setId(View.generateViewId());
    rightImageView.setId(View.generateViewId());
    sendButton.setId(View.generateViewId());
    setButton.setId(View.generateViewId());

    leftImageView.setOnClickListener(this);
    rightImageView.setOnClickListener(this);
    sendButton.setOnClickListener(this);
    setButton.setOnClickListener(this);



@Override
public void onClick(View v) {
    switch (v.getId()){
        case leftImageView.getId() : 
    }

这是这段代码中的错误截图:

【问题讨论】:

  • 你只有四个视图的na..所以手动设置ID而不是用视图生成。
  • 您不能在 switch 语句中使用非常量表达式作为 case。

标签: android click views listeners setting


【解决方案1】:

使用 id 常量 -

@Override public void onClick(View v) {
    switch (v.getId()){
        case R.id.image_view: 
    }

使用 if-else 语句代替 switch。它会正常工作的。

【讨论】:

  • 是动态按钮,所以在R文件中没有id
  • @ayuschjain 然后使用 if-else-if。
【解决方案2】:

您可以使用 Multipal if else 或可以使用 switch

public void onClick(View v) {
        if(v.getId()==leftImageView.getId())
        {

        }
        else
        if(v.getId()==rightImageView.getId())
        {

        }
    }

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.leftimage_view:
            break;
        }
    }

【讨论】:

  • 它是一个动态生成的按钮,在R.id.*文件中没有id的值。
【解决方案3】:

您必须为您的按钮分配一个已知 ID,如下所示:

  1. 在您的 Activity 中实现 View.OnClickListener

    public class Activity implements View.OnClickListener { }
    
  2. 生成已知 ID 并将按钮的回调注册到 OnClickListener

    leftImageView.setId(1);
    rightImageView.setId(2);
    sendButton.setId(3);
    setButton.setId(4);
    
    leftImageView.setOnClickListener(this);
    rightImageView.setOnClickListener(this);
    sendButton.setOnClickListener(this);
    setButton.setOnClickListener(this);
    
  3. 在你的 OnClick 方法中应该是这样的

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case 1:
                // leftImageView is click
                break;
            case 2:
                // rightImageView is click
                break;
            case 3:
                // sendButton is click
                break;
            case 4:
                // setButton is click
                break;
            default:
                break;
        }
    }
    

【讨论】:

    【解决方案4】:

    您可以简单地执行以下操作,而不是设置和获取 id:

            leftImageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                }
            });
            rightImageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                }
            });
            sendButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                }
            });
            setButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                }
            });
    

    【讨论】:

    • 是的,但这是多余的。我一直在寻找一种更有效的方法。这里我们只有 4 个视图,它们本来可以更多。
    【解决方案5】:

    您不能在onclick 中使用getId() 方法。 ID 应该是静态的。

    您可以分配一些硬编码的 id 以在 onclicklistener 中查看和使用它。

    @Override
    public void onClick(View v) {
        switch (v){
            case 45: 
            Break;
        }
    }
    

    【讨论】:

    • setId 函数不允许我将常量整数设置为 ID。它显示了上述错误
    • 试试上面的。即使它发出红色警告,它也应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多