Intereting Posts

Android: правильный способ использования onBackPressed () с помощью Toast

Я написал фрагмент кода, который даст пользователю приглашение с просьбой вернуться назад, если они захотят выйти. У меня в настоящее время мой код работает до такой степени, но я знаю, что он написан плохо, и я предполагаю, что есть лучший способ сделать это. Любые предложения будут полезны!

Код:

public void onBackPressed(){ backpress = (backpress + 1); Toast.makeText(getApplicationContext(), " Press Back again to Exit ", Toast.LENGTH_SHORT).show(); if (backpress>1) { this.finish(); } } 

Solutions Collecting From Web of "Android: правильный способ использования onBackPressed () с помощью Toast"

Я бы выполнил диалог с пользователем, если они хотели выйти, а затем вызвать super.onBackPressed (), если они это сделали.

 @Override public void onBackPressed() { new AlertDialog.Builder(this) .setTitle("Really Exit?") .setMessage("Are you sure you want to exit?") .setNegativeButton(android.R.string.no, null) .setPositiveButton(android.R.string.yes, new OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { WelcomeActivity.super.onBackPressed(); } }).create().show(); } 

В приведенном выше примере вам нужно будет заменить WelcomeActivity названием вашей деятельности.

Вам не нужен счетчик для обратных прессов.

Просто сохраните ссылку на тост, который показан:

private Toast backtoast;

Затем,

 public void onBackPressed() { if(USER_IS_GOING_TO_EXIT) { if(backtoast!=null&&backtoast.getView().getWindowToken()!=null) { finish(); } else { backtoast = Toast.makeText(this, "Press back to exit", Toast.LENGTH_SHORT); backtoast.show(); } } else { //other stuff... super.onBackPressed(); } } 

Это вызовет finish() если вы нажмете назад, пока тост все еще будет виден, и только если обратное нажатие приведет к выходу из приложения.

Я использую этот гораздо более простой подход …

 public class XYZ extends Activity { private long backPressedTime = 0; // used by onBackPressed() @Override public void onBackPressed() { // to prevent irritating accidental logouts long t = System.currentTimeMillis(); if (t - backPressedTime > 2000) { // 2 secs backPressedTime = t; Toast.makeText(this, "Press back again to logout", Toast.LENGTH_SHORT).show(); } else { // this guy is serious // clean up super.onBackPressed(); // bye } } } 

Как ваш путь, так и способ Стиву – приемлемые способы предотвращения случайных выходов.

Если вы решите продолжить свою реализацию, вам нужно будет убедиться, что обратное нажатие инициализировано на 0, и, возможно, реализовать Timer некоторого типа, чтобы вернуть его обратно в 0 после нажатия клавиши, после периода восстановления. (~ 5 секунд кажется правильным)

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

Кроме того, вам необходимо открыть диалог dismis перед вызовом activity.super.onBackPressed() , иначе вы получите сообщение «Activity is leaked ..».

Пример в моем случае с библиотекой sweetalerdialog:

  @Override public void onBackPressed() { //super.onBackPressed(); SweetAlertDialog progressDialog = new SweetAlertDialog(this, SweetAlertDialog.WARNING_TYPE); progressDialog.setCancelable(false); progressDialog.setTitleText("Are you sure you want to exit?"); progressDialog.setCancelText("No"); progressDialog.setConfirmText("Yes"); progressDialog.setCanceledOnTouchOutside(true); progressDialog.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() { @Override public void onClick(SweetAlertDialog sweetAlertDialog) { sweetAlertDialog.dismiss(); MainActivity.super.onBackPressed(); } }); progressDialog.show(); } 

Использовать для .onBackPressed () для возврата.

 @Override public void onBackPressed(){ backpress = (backpress + 1); Toast.makeText(getApplicationContext(), " Press Back again to Exit ", Toast.LENGTH_SHORT).show(); if (backpress>1) { this.finish(); } } 

Это лучший способ, потому что если пользователь не задержит более двух секунд, то сбросит сброшенное значение.

Объявить одну глобальную переменную.

  private boolean backPressToExit = false; 

Переопределить метод onBackPressed .

 @Override public void onBackPressed() { if (backPressToExit) { super.onBackPressed(); return; } this.backPressToExit = true; Snackbar.make(findViewById(R.id.yourview), getString(R.string.exit_msg), Snackbar.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() { @Override public void run() { backPressToExit = false; } }, 2000); } 

Я только что получил эту проблему и решил ее, добавив следующий метод:

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // click on 'up' button in the action bar, handle it here return true; default: return super.onOptionsItemSelected(item); } } 

Вы также можете использовать onBackPressed следующими способами, используя настроенный Toast:

Введите описание изображения здесь

customized_toast.xml

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/txtMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableStart="@drawable/ic_white_exit_small" android:drawableLeft="@drawable/ic_white_exit_small" android:drawablePadding="8dp" android:paddingTop="8dp" android:paddingBottom="8dp" android:paddingLeft="16dp" android:paddingRight="16dp" android:gravity="center" android:textColor="@android:color/white" android:textSize="16sp" android:text="Press BACK again to exit.." android:background="@drawable/curve_edittext"/> 

MainActivity.java

 @Override public void onBackPressed() { if (doubleBackToExitPressedOnce) { android.os.Process.killProcess(Process.myPid()); System.exit(1); return; } this.doubleBackToExitPressedOnce = true; Toast toast = new Toast(Dashboard.this); View view = getLayoutInflater().inflate(R.layout.toast_view,null); toast.setView(view); toast.setDuration(Toast.LENGTH_SHORT); int margin = getResources().getDimensionPixelSize(R.dimen.toast_vertical_margin); toast.setGravity(Gravity.BOTTOM | Gravity.CENTER_VERTICAL, 0, margin); toast.show(); new Handler().postDelayed(new Runnable() { @Override public void run() { doubleBackToExitPressedOnce=false; } }, 2000); }