Как предотвратить загрузку активности дважды при нажатии на кнопку - PullRequest
70 голосов
/ 10 ноября 2011

Я пытаюсь предотвратить загрузку действия дважды, если я дважды нажимаю кнопку после первого щелчка.

У меня есть действие, которое загружается при нажатии кнопки, скажем

 myButton.setOnClickListener(new View.OnClickListener() {
      public void onClick(View view) {
       //Load another activity
    }
});

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

Кто-нибудь знает, как это предотвратить?

Ответы [ 18 ]

2 голосов
/ 18 июня 2016

Другое очень очень простое решение, если вы не хотите использовать onActivityResult() - отключить кнопку на 2 секунды (или нужное время), не идеально, но может частично решить проблему в некоторых случаях, а код прост:

   final Button btn = ...
   btn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            //start activity here...
            btn.setEnabled(false);   //disable button

            //post a message to run in UI Thread after a delay in milliseconds
            btn.postDelayed(new Runnable() {
                public void run() {
                    btn.setEnabled(true);    //enable button again
                }
            },1000);    //1 second in this case...
        }
    });
0 голосов
/ 20 марта 2019

// переменная для отслеживания времени события

private long mLastClickTime = 0;

2.В onClick проверьте, что если текущее время и разница во времени последнего клика меньше, чем я секунда, то ничего не делать (возврат) иначе перейти на событие клика

 @Override
public void onClick(View v) {
    // Preventing multiple clicks, using threshold of 1 second
    if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) {
        return;
          }
    mLastClickTime = SystemClock.elapsedRealtime();
            // Handle button clicks
            if (v == R.id.imageView2) {
        // Do ur stuff.
         }
            else if (v == R.id.imageView2) {
        // Do ur stuff.
         }
      }
 }
0 голосов
/ 31 октября 2015

Если вы используете onActivityResult, вы можете использовать переменную для сохранения состояния.

private Boolean activityOpenInProgress = false;

myButton.setOnClickListener(new View.OnClickListener() {
  public void onClick(View view) {
    if( activityOpenInProgress )
      return;

    activityOpenInProgress = true;
   //Load another activity with startActivityForResult with required request code
  }
});

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if( requestCode == thatYouSentToOpenActivity ){
    activityOpenInProgress = false;
  }
}

Работает и при нажатой кнопке возврата, потому что код запроса возвращается при событии.

0 голосов
/ 17 июля 2015

Вы можете просто переопределить startActivityForResult и использовать переменную экземпляра:

boolean couldStartActivity = false;

@Override
protected void onResume() {
    super.onResume();

    couldStartActivity = true;
}

@Override
public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
    if (couldStartActivity) {
        couldStartActivity = false;
        intent.putExtra(RequestCodeKey, requestCode);
        super.startActivityForResult(intent, requestCode, options);
    }
}
0 голосов
/ 10 ноября 2011
myButton.setOnClickListener(new View.OnClickListener() {
      public void onClick(View view) {
      myButton.setOnClickListener(null);
    }
});
0 голосов
/ 10 ноября 2011

Вы можете попробовать это также

Button game = (Button) findViewById(R.id.games);
        game.setOnClickListener(new View.OnClickListener() 
        {
            public void onClick(View view) 
            {
                Intent myIntent = new Intent(view.getContext(), Games.class);
                startActivityForResult(myIntent, 0);
            }

        });
0 голосов
/ 10 ноября 2011

Используйте переменную flag, установите его to true, Проверьте, правда ли это, просто return, иначе выполните Activity Call.

Вы также можете использовать setClickable (false) для выполнения вызова активности

flg=false
 public void onClick(View view) { 
       if(flg==true)
         return;
       else
       { flg=true;
        // perform click}
    } 
0 голосов
/ 10 ноября 2011

Просто сохраните один флажок в методе onClick кнопки как:

public boolean oneTimeLoadActivity = false;

    myButton.setOnClickListener(new View.OnClickListener() {
          public void onClick(View view) {
               if(!oneTimeLoadActivity){
                    //start your new activity.
                   oneTimeLoadActivity = true;
                    }
        }
    });
...