如何在按钮被点击后立即禁用它

6
我有一个按钮,点击它会加载另一个活动。但是,如果我连续点击它,在加载另一个活动之前,它会启动该活动,但是同一个活动会被加载两次或更多次。 我尝试在button.setOnClickListener...onClick之后立即使用button.setEnabled(false),但是它没有禁用该按钮。我还在按钮被点击时记录了一段文本,因此根据我的点击次数,即使我点击了10次,它也会记录2或3次文本。 我感觉这里的问题是在按钮可以监听到点击事件之前,我点击得太快,以至于它会按照我点击的次数监听所有这些事件。

因此,我需要一个方法,使按钮只能监听一次点击,然后禁用它。
请帮忙解决。

当您再次启用它时,button.setEnabled(false); 应该起作用吗? - Dheeresh Singh
2
setEnabled(false) 不起作用,因为它太晚了。按钮点击事件已经在队列中了。 - David Wasser
1
在不引入变量的情况下,只是这样做有什么问题吗(伪代码): code onClick(v) if (btn.isEnabled()) { btn.setEnabled(false); // do stuff } // end onClick code - Lo-Tan
7个回答

7

这是一个已知的问题。基本上你可以设置标志。

int flag=1;

 @Override
        public void onClick(View v) 
           {

                if(flag)
                 {
                   button.setEnabled(false);
                   Log.d("ins", "called");
                 }
                flag=0;
            }

1
我认为这里的标志类型应该是布尔型,或者你需要检查 if(flag == 1) - Shailendra Madda

4
更为优选的解决方案是:
onclick(){
  btn.setEnabled(false);
  btn.setClickable(false);
  //yourwork
  myWork();
}

myWork(){
 //your tasks.
 btn.setEnabled(true);
 btn.setClickable(true);
}

2

这可以被视为一个android-bug。您的假设是正确的,即点击事件被系统捕获,并且如果连续点击一个可点击的元素,则可能会提供太晚。您可以尝试通过插入一个像这样的 boolean 值来解决此问题。

private boolean handledClick = false;

public void onClick(View v){
    if (!handledClick){
        handledClick = true;
        startActivity(...);
    }
}

这将确保,即使 onClick 被触发多次,内部的代码也只会被执行一次...


3
请确保在某个时刻重新启用按钮(通过将handledClick设置为false)。 - David Wasser

0
尝试像这样使用Button.setEnabled(true/false)
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v.isEnabled()) {
                v.setEnabled(false);
            }
        }
    });

您可以通过调用Button.isEnabled()来检查Button是否启用。


了解更多关于按钮的内容,请阅读此文…


0

我也遇到了类似的问题,但我能够在监听器的onClick()回调方法中使用button.setEnabled(false)禁用按钮。我会在具有该按钮的活动的onResume()onRestart()onWindowFocusChanged()中启用该按钮。

我认为这是防止用户连续点击按钮的一种方式。


setEnabled(false) 不起作用,因为它太晚了。按钮点击事件已经在队列中了。 - David Wasser
@DavidWasser,问题陈述要求按钮点击只能发生一次。因此,正如您所指出的那样,第一次单击事件将在队列中,但是如果我们禁用它(使用setEnabled(false)),并将其作为onClick()的第一行代码,它将不允许第二次单击事件发生。 - Arun George
不,实际上并不是这样的。如果用户快速按下按钮5次,Android框架将在消息队列中放置5个onClick事件。当第一个事件被传递到onClick()方法时,按钮将被禁用,但此时已经造成了损害。我见过这种情况无数次。你不能可靠地通过setEnabled()解决这个问题。 - David Wasser
@DavidWasser,那你提出的解决方案是什么? - bman
@bman 看一下被接受的答案。你需要记住用户通过设置一个 boolean 变量来点击按钮。然后,在 onClick() 方法中,如果标志已经被设置,你就忽略这个操作(这意味着用户已经执行了无论什么操作)。一旦操作成功执行,你可以将 boolean 变量重置为 false,以允许用户再次点击它(如果这符合你的应用程序工作流程)。 - David Wasser
重要的是要记住,单击按钮并不会立即调用 onClick() 方法,它只是将事件添加到队列中以便稍后执行。因此,如果用户非常快(或者电话或您的应用程序响应速度较慢),则该事件可能会被多次添加到队列中。 - David Wasser

0
如果您需要的是按钮,那么“go”指的就是它。
 go.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
    //    your code here
          go.setEnabled(false);
        }
    });

编辑:由于它仍在排队,那么怎么样呢。

s.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            s.setEnabled(false);
            if(flag == 1){
                flag=0;
                //your code here
            }
        }
    });

我已经指定了使用与您相同的代码,但是尽管使用了go.setEnabled(false),它仍未被禁用。go.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // 在此处编写您的代码 go.setEnabled(false); } }); - Ali Ashraf
setEnabled(false) 不起作用,因为太晚了。按钮点击事件已经在队列中了。 - David Wasser
我已经指定了使用与您相同的方法,但是尽管使用了go.setEnabled(false),它仍未被禁用。 go.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // 在此处编写您的代码 go.setEnabled(false); //还有很多其他代码... Intent intent = new Intent(CurrentActivity.this,NextActivity.class); intent.putExtra("xyz","abc"); intent.putExtra("jjjd","dddd"); intent.putExtra("szdsd","abssdc"); intent.putExtra("xadasyz","afdsafsbc"); startActivity(intent); - Ali Ashraf

0

我也遇到了同样的问题,这是我解决它的方法:

int flag = 1;

 private OnClickListener btnNextActivity = new OnClickListener(){
    public void onClick(View v) {

            if(flag){
          Intent nextActivity = new Intent(getApplicationContext(),NextActivity.class);
          nextActivity.setClassName(". . .",". . ." );
          . . .
          startActivity(nextActivity);
          flag = 0;
            }

           else{
            Show Toast Message Here
              }
      }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接