Android:使用onBackPressed()和Toast的正确方法
我写了一段代码,会给用户一个提示,要求他们再次按下,如果他们想退出。 我目前有我的代码在一定程度上工作,但我知道它写得不好,我认为有一个更好的方法来做到这一点。 任何build议将是有益的!
码:
public void onBackPressed(){ backpress = (backpress + 1); Toast.makeText(getApplicationContext(), " Press Back again to Exit ", Toast.LENGTH_SHORT).show(); if (backpress>1) { this.finish(); } }
我会实现一个对话框询问用户是否要退出,然后调用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(); }
在上面的例子中,您需要用您的活动名称replaceWelcomeActivity。
你不需要背面的柜台。
只需存储一个对所显示的吐司的引用:
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 } } }
你的方式和@史蒂夫的方式是可以接受的方法来防止意外退出。
如果select继续执行,则需要确保将backpress初始化为0,并且可能需要实现某种Timer
,以在冷却时间后按键时将其重置为0。 (约5秒似乎是正确的)
您可能还需要在onPause
重置计数器,以防止用户在第一次按下后按下回家或通过其他方式导航离开的情况。 否则,我没有看到一个问题。
如果你想退出你的应用程序从直接的第二个活动,而不去第一个活动,然后尝试这个代码..“
在第二个活动把这个代码..
@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(); } } } }
}
另外,你需要在调用activity.super.onBackPressed()
之前先对话,否则你会得到“Activity has 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()来返回Activity指定
@Override public void onBackPressed(){ backpress = (backpress + 1); Toast.makeText(getApplicationContext(), " Press Back again to Exit ", Toast.LENGTH_SHORT).show(); if (backpress>1) { this.finish(); } }
这是最好的方法,因为如果用户不超过两秒钟,然后重置压缩的值。
声明一个全局variables。
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); } }
您还可以通过使用自定义Toast的以下方式使用onBackPressed:
在这里input图像说明
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); }