2012-06-14 3 views
5

У меня есть кнопка, которая на клике загружает другое действие, но прежде чем она загружает другое действие, если я нажимаю его непрерывно, тогда он запускает действие, но одно и то же действие загружается два или более раза , Я попытался button.setEnabled (false) вскоре после button.setOnClickListener ... onClick , но это не отключает кнопку, я также регистрирую текст, как только кнопка нажата, поэтому в зависимости от моих кранов он регистрирует текст 2 или 3 раза, даже если я постучал его 10 раз. Что я чувствую, прежде чем кнопка сможет прослушивать события нажатия, я нажимаю ее так быстро, что она слушает все эти события столько раз, сколько я нажимаю на нее.Как отключить кнопку, как только ее щелкнули

Таким образом, мне нужно что-то, где кнопка может просто прослушать один кран, а затем отключить его.

пожалуйста, помогите

+0

button.setEnabled (ложь); должен работать, когда вы снова включаете его? –

+2

setEnabled (false) не будет работать, потому что уже слишком поздно. События нажатия кнопки уже находятся в очереди. –

+1

Что случилось с (вместо введения переменной), просто делая это (псевдокод): 'code' onClick (v) if (btn.isEnabled()) { btn.setEnabled (false); // do stuff } // end onClick 'code' –

ответ

7

Его известная проблема. В основном вы можете установить флаг.

int flag=1; 

@Override 
     public void onClick(View v) 
      { 

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

can вы публикуете свой код? –

+0

Это сработало .... !!!! спасибо flag = 0; должно быть после onClick() – Ali

+1

Я думал, что здесь тип флага должен быть логическим или вам нужно проверить 'if (flag == 1)' –

0

У меня тоже была похожая проблема, но я был в состоянии отключить кнопку в методе обратного вызова onClick() слушателя с помощью button.setEnabled (ложь) кнопки. Я включаю кнопку на onResume(), onRestart() и onWindowFocusChanged() активности, у которой есть кнопка.

И я предполагаю, что это один из способов запретить пользователю нажимать кнопку (непрерывно).

+0

setEnabled (false) не будет работать, потому что уже слишком поздно. События нажатия кнопки уже находятся в очереди. –

+0

@DavidWasser. Оператор проблемы требует, чтобы нажатие кнопки выполнялось один раз. Так как вы указали, что событие click будет в очереди в первый раз, но если мы отключим его (используя setEnabled (false)), имея этот код в качестве первой строки 'onClick()', это не позволит щелчку происходят во второй раз. –

+0

Нет, на самом деле это не то, что происходит. Если пользователь нажимает бутон 5 раз очень быстро, инфраструктура Android помещает 5 событий onClick в очередь сообщений. Когда первое событие будет доставлено методу onClick(), кнопка будет отключена, но к тому времени урон уже будет выполнен. Я видел это миллион раз. Вы не можете надежно решить эту проблему с помощью setEnabled(). –

0

Если идти относится к кнопке вам,

go.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
    // your code here 
      go.setEnabled(false); 
     } 
    }); 

EDIT: Так как он по-прежнему очереди вверх, как о.

s.setOnClickListener(new View.OnClickListener() { 

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

YA Я указал, что использую это, как вы использовали, но, несмотря на использование go.setEnabled (false), он не отключается. go.setOnClickListener (новый View.OnClickListener() { общественного недействительными OnClick (View v) {// код здесь go.setEnabled (ложь); } }); – Ali

+0

хорошая работа ....... – user4232

+0

setEnabled (false) не будет работать, потому что уже слишком поздно. События нажатия кнопки уже находятся в очереди. –

2

Это можно считать андроид-ошибкой. Вы правы в своем предположении, что событие click поймано системой и может быть предоставлено слишком поздно, если один клик непрерывно нажимается. Вы можете попытаться обойти эту проблему, вставляя значение boolean как этот

private boolean handledClick = false; 

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

это обеспечит, что даже если onClick срабатывает более, что один раз, код внутри получает выполняется только один раз ...

+3

Просто убедитесь, что вы в какой-то момент включаете кнопку (путем установки handledClick обратно на false). –

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 
       } 
     } 
}; 
4

более предпочтительным решением является,

onclick(){ 
    btn.setEnabled(false); 
    btn.setClickable(false); 
    //yourwork 
    myWork(); 
} 

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

@ Насимха На нескольких кранах на одной кнопке это делает nt work – Ali

0

Попробуйте Button.setEnabled(true/false) так:

btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (v.isEnabled()) { 
       v.setEnabled(false); 
      } 
     } 
    }); 

Вы также можете установить Button, позвонив по телефону Button.isEnabled().


Более подробную информацию о ButtonRead This…

Смежные вопросы