Android: правильный способ использования onBackPressed () с тостом
Я написал кусок кода, который даст пользователю приглашение с просьбой нажать назад снова, если они хотели бы выйти. В настоящее время мой код работает в определенной степени, но я знаю, что он написан плохо, и я предполагаю, что есть лучший способ сделать это. Любые предложения будут полезны!
код:
public void onBackPressed(){
backpress = (backpress + 1);
Toast.makeText(getApplicationContext(), " Press Back again to Exit ", Toast.LENGTH_SHORT).show();
if (backpress>1) {
this.finish();
}
}
11 ответов:
Я бы реализовал диалог с запросом пользователя, если они хотят выйти, а затем позвонить
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 } } }
и ваш путь, и путь @Steve являются приемлемыми способами предотвращения случайных выходов.
Если вы решите продолжить реализацию, вам нужно будет убедиться, что backpress инициализирован до 0 и, вероятно, реализует
Timer
своего рода, чтобы сбросить его обратно в 0 при нажатии клавиши, после периода восстановления. (~5 секунд кажется правильным)
вам также может потребоваться сбросить счетчик в
onPause
чтобы предотвратить случаи, когда пользователь нажимает домой или перемещается с помощью некоторых других средств после первого нажатия назад. В противном случае, я не вижу проблемы.
использовать для .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(); } }
Если вы хотите выйти из приложения из прямого второго действия, не переходя к первому действию, попробуйте этот код..-
во втором действии поставьте этот код..
@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 DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { setResult(RESULT_OK, new Intent().putExtra("EXIT", true)); finish(); } }).create().show(); }
и Ваша первая деятельность положить этот код.....
public class FirstActivity extends AppCompatActivity { Button next; private final static int EXIT_CODE = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); next = (Button) findViewById(R.id.next); next.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivityForResult(new Intent(FirstActivity.this, SecondActivity.class), EXIT_CODE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == EXIT_CODE) { if (resultCode == RESULT_OK) { if (data.getBooleanExtra("EXIT", true)) { finish(); } } } }
}
кроме того, необходимо, чтобы диалог dissmis перед вызовом
activity.super.onBackPressed()
, иначе вы получите " утечка активности.." ошибка.пример в моем случае с библиотекой 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(); }
Это лучший способ, потому что если пользователь не nack более двух секунд, а затем сбросить значение обратного сжатия.
объявить глобальную переменную.
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 следующими способами, используя настроенный тост:
Введите описание изображения здесь
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); }