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();
}
}
Ответы
Ответ 1
Я бы воспользовался диалоговым окном, спрашивающим пользователя, хотят ли они выйти, а затем вызовет 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 названием вашей деятельности.
Ответ 2
Вам не нужен счетчик для обратных прессов.
Просто сохраните ссылку на тост, который показан:
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()
, если вы нажмете назад, пока тост все еще будет виден, и только если обратное нажатие приведет к выходу из приложения.
Ответ 3
Я использую этот гораздо более простой подход...
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
}
}
}
Ответ 4
Как ваш путь, так и метод @Steve являются приемлемыми способами предотвращения случайных выходов.
Если вы решите продолжить свою реализацию, вам нужно будет убедиться, что обратное нажатие инициализировано на 0, и, возможно, с Timer
какого-либо рода до reset он возвращается к 0 на клавиатуре после периода перезарядки. (~ 5 секунд кажется правильным)
Ответ 5
Вам также может потребоваться reset счетчик в onPause
, чтобы предотвратить случаи, когда пользователь нажимает домой или перемещается другими средствами после первого повторного нажатия. В противном случае я не вижу проблемы.
Ответ 6
Это лучший способ, потому что если пользователь не вернулся назад более чем на две секунды, сбросьте значение возврата.
объявить одну глобальную переменную.
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);
}
Ответ 7
использовать для .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();
}
}
Ответ 8
Если вы хотите выйти из приложения из прямой Second Activity, не перейдя в First Activity, попробуйте этот код... `
В Second Activity поместите этот код..
@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();
}
}
}
}
}
Ответ 9
Кроме того, вам нужно открыть диалог 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();
}
Ответ 10
У меня была эта проблема и она была решена, добавив следующий метод:
@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);
}
}
Ответ 11
Вы также можете использовать 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);
}
Ответ 12
Используйте это, это может помочь.
@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();
}