Escribí un fragmento de código que le dará al usuario un mensaje pidiéndole que vuelva a presionar si desea salir. Actualmente tengo mi código funcionando hasta cierto punto, pero sé que está mal escrito y supongo que hay una mejor manera de hacerlo. ¡Cualquier sugerencia sería útil!
Código:
public void onBackPressed(){
backpress = (backpress + 1);
Toast.makeText(getApplicationContext(), " Press Back again to Exit ", Toast.LENGTH_SHORT).show();
if (backpress>1) {
this.finish();
}
}
this.finish()
consuper.onBackPressed();
.this.finish()
llamarNavUtils.navigateUpFromSameTask(this);
para volver a la pantalla / actividad anteriorRespuestas:
Implementaría un diálogo preguntando al usuario si quería salir y luego llamaría
super.onBackPressed()
si lo hiciera.@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(); }
En el ejemplo anterior, deberá reemplazar WelcomeActivity con el nombre de su actividad.
fuente
super.onBackPressed()
en tuonBackPressed()
definición (que no sea la que está dentro del método onClick)?android.os.Process.killProcess(android.os.Process.myPid());
pero la animación entre actividades no es tan fluida. En lugar de esto, muestra una pantalla negra durante aproximadamente la mitad del segundo.No necesitas un contador para prensas traseras.
Simplemente guarde una referencia al brindis que se muestra:
private Toast backtoast;
Entonces,
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(); } }
Esto llamará
finish()
si presiona hacia atrás mientras el brindis aún está visible, y solo si al presionar hacia atrás se sale de la aplicación.fuente
this.finish()
llamarNavUtils.navigateUpFromSameTask(this);
para volver a la pantalla / actividad anteriorUtilizo este enfoque mucho más simple ...
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 } } }
fuente
Tanto a tu manera como a la de @ Steve son formas aceptables de evitar salidas accidentales.
Si elige continuar con su implementación, deberá asegurarse de tener la retropresión inicializada en 0, y probablemente implementar una
Timer
de algún tipo para restablecerla a 0 al presionar la tecla, después de un período de enfriamiento. (~ 5 segundos parece correcto)fuente
También es posible que deba restablecer el contador
onPause
para evitar casos en los que el usuario presiona Inicio o se aleja por algún otro medio después de presionar por primera vez. De lo contrario, no veo ningún problema.fuente
Si desea salir de su aplicación desde la segunda actividad directa sin ir a la primera actividad, pruebe este código ...`
En Segunda Actividad ponga este código.
@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(); }
Y tu primera actividad Pon este código .....
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(); } } } }
}
fuente
Esta es la mejor manera, porque si el usuario no retrocede más de dos segundos, restablezca el valor de retroceso.
private boolean backPressToExit = false;
@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); }
fuente
Además, debe descartar el cuadro de diálogo antes de llamar
activity.super.onBackPressed()
, de lo contrario obtendrá el error "La actividad se ha filtrado ...".Ejemplo en mi caso con la biblioteca 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(); }
fuente
usar para .onBackPressed () para retroceder Especificar actividad
@Override public void onBackPressed(){ backpress = (backpress + 1); Toast.makeText(getApplicationContext(), " Press Back again to Exit ", Toast.LENGTH_SHORT).show(); if (backpress>1) { this.finish(); } }
fuente
Acabo de tener este problema y lo resolví agregando el siguiente método:
@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); } }
fuente
También puede usar onBackPressed de las siguientes formas usando Toast personalizado:
ingrese la descripción de la imagen aquí
custom_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); }
fuente
Use esto, puede ayudar.
@Override public void onBackPressed() { new AlertDialog.Builder(this) .setTitle("Message") .setMessage("Do you want to exit app?") .setNegativeButton("NO", null) .setPositiveButton("YES", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { UserLogin.super.onBackPressed(); } }).create().show(); }
fuente