ฉันพยายามแสดงข้อความ "คุณต้องการออกหรือไม่" ชนิดของกล่องโต้ตอบเมื่อผู้ใช้พยายามออกจากกิจกรรม
อย่างไรก็ตามฉันไม่พบ API hooks ที่เหมาะสม Activity.onUserLeaveHint()
เริ่มแรกดูมีแนวโน้ม แต่ฉันไม่สามารถหาวิธีหยุดกิจกรรมจากการทำกิจกรรมให้เสร็จ
ฉันพยายามแสดงข้อความ "คุณต้องการออกหรือไม่" ชนิดของกล่องโต้ตอบเมื่อผู้ใช้พยายามออกจากกิจกรรม
อย่างไรก็ตามฉันไม่พบ API hooks ที่เหมาะสม Activity.onUserLeaveHint()
เริ่มแรกดูมีแนวโน้ม แต่ฉันไม่สามารถหาวิธีหยุดกิจกรรมจากการทำกิจกรรมให้เสร็จ
คำตอบ:
ใน Android 2.0+ จะมีลักษณะดังนี้:
@Override
public void onBackPressed() {
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Closing Activity")
.setMessage("Are you sure you want to close this activity?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setNegativeButton("No", null)
.show();
}
ในรุ่นก่อนหน้ามันจะมีลักษณะ:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//Handle the back button
if(keyCode == KeyEvent.KEYCODE_BACK) {
//Ask the user if they want to quit
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(R.string.quit)
.setMessage(R.string.really_quit)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//Stop the activity
YourClass.this.finish();
}
})
.setNegativeButton(R.string.no, null)
.show();
return true;
}
else {
return super.onKeyDown(keyCode, event);
}
}
@Override
public void onBackPressed() {
new AlertDialog.Builder(this)
.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ExampleActivity.super.onBackPressed();
}
})
.setNegativeButton("No", null)
.show();
}
CustomTabActivity.super.onBackPressed
finish()
รหัสด้วยsuper.onBackPressed()
หรือไม่
MyActivity.super.onBackPressed();
และใช้งานได้ดีสำหรับฉัน ดูเหมือนว่าจะเป็นวิธีการที่มีเหตุผลมากที่สุดเช่นกัน - เรียกวิธีที่คุณเอาชนะถ้าคุณต้องการพฤติกรรมมาตรฐานเมื่อผู้ใช้แตะที่ "ไม่"
มีการแก้ไข @ user919216 รหัส .. และทำให้มันเข้ากันได้กับ WebView
@Override
public void onBackPressed() {
if (webview.canGoBack()) {
webview.goBack();
}
else
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
ฉันต้องการออกด้วยการแตะสองครั้งที่ปุ่มย้อนกลับมากกว่าด้วยกล่องโต้ตอบออก
ในโซลูชันนี้จะแสดงขนมปังเมื่อกลับไปเป็นครั้งแรกเตือนว่าการกดกลับอีกครั้งจะปิดแอป ในตัวอย่างนี้น้อยกว่า 4 วินาที
private Toast toast;
private long lastBackPressTime = 0;
@Override
public void onBackPressed() {
if (this.lastBackPressTime < System.currentTimeMillis() - 4000) {
toast = Toast.makeText(this, "Press back again to close this app", 4000);
toast.show();
this.lastBackPressTime = System.currentTimeMillis();
} else {
if (toast != null) {
toast.cancel();
}
super.onBackPressed();
}
}
โทเค็นจาก: http://www.androiduipatterns.com/2011/03/back-button-behavior.html
หากคุณไม่แน่ใจว่าการโทรไปที่ "ย้อนกลับ" จะออกจากแอปหรือจะนำผู้ใช้ไปยังกิจกรรมอื่นคุณสามารถใส่คำตอบข้างต้นในการตรวจสอบ isTaskRoot () สิ่งนี้อาจเกิดขึ้นได้หากกิจกรรมหลักของคุณสามารถเพิ่มลงในสแต็กหลังได้หลายครั้งหรือหากคุณกำลังจัดการกับประวัติสแต็กหลังของคุณ
if(isTaskRoot()) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
YourActivity.super.onBackPressed;
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
} else {
super.onBackPressed();
}
การใช้แลมบ์ดา:
new AlertDialog.Builder(this).setMessage(getString(R.string.exit_msg))
.setTitle(getString(R.string.info))
.setPositiveButton(getString(R.string.yes), (arg0, arg1) -> {
moveTaskToBack(true);
finish();
})
.setNegativeButton(getString(R.string.no), (arg0, arg1) -> {
})
.show();
คุณต้องตั้งค่าภาษาระดับเพื่อรองรับ java 8 ใน gradle.build ของคุณ:
compileOptions {
targetCompatibility 1.8
sourceCompatibility 1.8
}
ในประเทศจีนแอพส่วนใหญ่จะยืนยันการออกโดย "คลิกสองครั้ง":
boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce=false;
}
}, 2000);
}
ก่อนอื่นให้ลบออกsuper.onBackPressed();
จากonbackPressed()
วิธีที่เกินกว่ารหัส
@Override
public void onBackPressed() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
MyActivity.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
ฉันชอบ @GLee วิธีการและใช้กับส่วนดังต่อไปนี้
@Override
public void onBackPressed() {
if(isTaskRoot()) {
new ExitDialogFragment().show(getSupportFragmentManager(), null);
} else {
super.onBackPressed();
}
}
กล่องโต้ตอบที่ใช้แฟรกเมนต์:
public class ExitDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setTitle(R.string.exit_question)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
getActivity().finish();
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
getDialog().cancel();
}
})
.create();
}
}
Just put this code in your first activity
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(GravityCompat.END)) {
drawerLayout.closeDrawer(GravityCompat.END);
}
else {
// if your using fragment then you can do this way
int fragments = getSupportFragmentManager().getBackStackEntryCount();
if (fragments == 1) {
new AlertDialog.Builder(this)
.setMessage("Are you sure you want to exit?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
})
.setNegativeButton("No", null)
.show();
} else {
if (getFragmentManager().getBackStackEntryCount() > 1) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
}
}
อีกทางเลือกหนึ่งคือการแสดง a Toast
/ Snackbar
บน back back แรกที่ขอให้กด back อีกครั้งเพื่อออกซึ่งเป็นการรบกวนน้อยกว่าการแสดงAlertDialog
เพื่อยืนยันว่าผู้ใช้ต้องการออกจากแอป
คุณสามารถใช้DoubleBackPress Android Library
เพื่อให้ได้สิ่งนี้ด้วยโค้ดสองสามบรรทัด ตัวอย่าง GIF แสดงพฤติกรรมที่คล้ายกัน
ในการเริ่มต้นด้วยเพิ่มการพึ่งพาแอปพลิเคชันของคุณ:
dependencies {
implementation 'com.github.kaushikthedeveloper:double-back-press:0.0.1'
}
จากนั้นในกิจกรรมของคุณให้ใช้พฤติกรรมที่ต้องการ
// set the Toast to be shown on FirstBackPress (ToastDisplay - builtin template)
// can be replaced by custom action (new FirstBackPressAction{...})
FirstBackPressAction firstBackPressAction = new ToastDisplay().standard(this);
// set the Action on DoubleBackPress
DoubleBackPressAction doubleBackPressAction = new DoubleBackPressAction() {
@Override
public void actionCall() {
// TODO : Exit the application
finish();
System.exit(0);
}
};
// setup DoubleBackPress behaviour : close the current Activity
DoubleBackPress doubleBackPress = new DoubleBackPress()
.withDoublePressDuration(3000) // msec - wait for second back press
.withFirstBackPressAction(firstBackPressAction)
.withDoubleBackPressAction(doubleBackPressAction);
ในที่สุดตั้งค่านี้เป็นพฤติกรรมที่กดกลับ
@Override
public void onBackPressed() {
doubleBackPress.onBackPressed();
}