Pregunta Android: forma correcta de usar onBackPressed () con tostadas


Escribí un fragmento de código que le indicará al usuario que le pida que presione nuevamente si desea salir. Actualmente tengo mi código funcionando en cierta medida, 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();
    }
}

73
2018-06-20 15:31


origen


Respuestas:


Implementaría un cuadro de diálogo preguntándole al usuario si quería salir y luego llamar super.onBackPressed() si lo hicieron

@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 por el nombre de su actividad.


183
2018-06-20 15:33



No necesita un contador para prensas traseras.

Simplemente almacene una referencia a la tostada 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 la tostada todavía está visible, y solo si la retroceso da como resultado la salida de la aplicación.


16
2018-02-17 23:48



Utilizo 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
        }
    }
}

13
2018-06-20 15:36



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 contrapresión inicializada en 0, y probablemente implementar una Timer de algún tipo para restablecerlo de nuevo a 0 al presionar una tecla, después de un período de enfriamiento. (~ 5 segundos parece correcto)


2
2018-06-20 15:37



Es posible que también deba restablecer el contador en onPause para evitar casos cuando el usuario presiona el inicio o navega por otros medios después de la primera vez que presione de nuevo. De lo contrario, no veo un problema.


2
2017-07-01 10:16



utilizar para .onBackPressed () para retroceder Actividad especificar

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

    if (backpress>1) {
        this.finish();
    }
}

1
2017-08-30 07:48



Si desea salir de su aplicación de la segunda actividad directa sin ir a la primera actividad, intente con este código ... "

En Second Activity 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 su primera actividad Ponga 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();
            }
        }
    }
}

}


1
2018-05-09 16:48



adicionalmente, debe rechazar el diálogo antes de llamar activity.super.onBackPressed()de lo contrario, aparecerá el mensaje "La actividad se ha filtrado ...".

Ejemplo en mi caso con la librería 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();
    }

0
2017-09-19 16:18



Esta es la mejor manera, porque si el usuario no falla más de dos segundos, restablece el valor de retroceso.

declara una variable global.

 private boolean backPressToExit = false;

Anular onBackPressed Método.

@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);
}

0
2017-10-19 17:43



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

0
2017-11-23 07:42