我正在尝试实施确认消息以退出我的应用。我需要这个,因为有人可能会不小心点击后退按钮多次,这将关闭应用程序,如果内存不足,它将在此之后被杀死,因为现在它不在前台。
我尝试了不同的方法,但其中一些需要大量检查,其他方法根本不起作用
我曾尝试使用onKeyDown
事件,onBackPressed
...
问题是因为我不仅仅处理活动,还处理嵌套片段(内部活动)
我需要在退出之前处理最后一次按下后退的点击,这意味着当前活动的所有片段都必须从堆栈中弹出,而且还必须弹出活动,如果这不是最后一个活动,则执行相同操作对于前面的活动,直到这不是最后一个活动,并且所有碎片都会弹出
我该如何实现呢?我试图用背板做这件事,但不幸的是没有成功
请建议处理此类事件的最佳方法。我想有一种简单的方法可以做到这一点。
答案 0 :(得分:1)
基本覆盖主要活动中的onBackPressed
(),如果用户选择“否”退出应用,则无法调用父super.onBackPressed()
。
代码建议:
@Override
public void onBackPressed() {
new AlertDialog.Builder(this)
.setTitle("Exiting app?")
.setPositiveButton("Yes", new OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
// user really do want to exit
MainActivity.super.onBackPressed();
}
}).create().show();
// If negative, show a Fragment or do nothing
}
答案 1 :(得分:1)
我不确定,但我认为您可以使用整数来计算您的片段,在添加新片段时增加它,并在每次背压时减少。它可能是这样的:
@Override public void onBackPressed() {
if( fragCount > 0) {
--fragCount;
super.onBackPressed();
return;
}
new AlertDialog.Builder(this) .setTitle("Exiting app?") .setPositiveButton("Yes", new OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { // user really do want to exit
MainActivity.super.onBackPressed(); } }).create().show();
}
注意:抱歉打字不好我正在打电话。
答案 2 :(得分:1)
感谢大家的答案和建议
通过在堆栈中使用片段计数,我达到了预期的结果
至于我的主要活动将是第一个活动,最后一个活动是退出,我可以在其中覆盖onBackPressed
方法。
所以解决方案很简单。
public class MainActivity extends BaseSingleFragmentActivity {
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(R.string.title_exit_message)
.setMessage(R.string.message_exit)
.setPositiveButton(R.string.button_text_yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
MainActivity.super.onBackPressed();
}
})
.setNegativeButton(R.string.button_text_no, null)
.show();
} else {
MainActivity.super.onBackPressed();
}
}
}
因此,只有当您的活动在活动堆栈中排在最后时才会起作用,因此您必须将其覆盖启动器活动,而不是某些基本活动类或其他活动。
我的想法有点改进。
package com.crosp.solutions.qrcodereader.dialogs;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import com.crosp.solutions.qrcodereader.R;
import com.crosp.solutions.qrcodereader.constants.FragmentConstants;
/**
* Created by crosp on 7/9/15.
*/
public class ConfirmationDialog extends DialogFragment implements DialogInterface.OnClickListener {
private OnConfirmDialogClickListener mOnConfirmDialogListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mOnConfirmDialogListener = (OnConfirmDialogClickListener) activity;
} catch (ClassCastException ex) {
Log.e(getString(R.string.error_tag), "Activty has to implement " + OnConfirmDialogClickListener.class.getSimpleName() + " interface");
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
.setPositiveButton(R.string.button_text_yes, this)
.setNegativeButton(R.string.button_text_no, this);
Bundle bundle = getArguments();
String message = getString(R.string.message_exit);
String title = getString(R.string.title_exit_message);
int iconId = android.R.drawable.ic_dialog_alert;
if (bundle != null) {
String argumentMessage = bundle.getString(FragmentConstants.Arguments.DIALOG_MESSAGE_ARGUMENT);
String argumentTitle = bundle.getString(FragmentConstants.Arguments.DIALOG_TITLE_ARGUMENT);
int argumentIconId = bundle.getInt(FragmentConstants.Arguments.DIALOG_ICON_ID_ARGUMENT);
message = argumentMessage != null ? argumentMessage : message;
title = argumentTitle != null ? argumentTitle : title;
iconId = argumentIconId != 0 ? argumentIconId : iconId;
}
builder.setIcon(iconId);
builder.setMessage(message);
builder.setTitle(title);
return builder.create();
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
mOnConfirmDialogListener.onConfirmClick();
} else if (which == DialogInterface.BUTTON_NEGATIVE) {
mOnConfirmDialogListener.onCancelClick();
}
}
public interface OnConfirmDialogClickListener {
void onConfirmClick();
void onCancelClick();
}
}
活动
public class MainActivity extends BaseSingleFragmentActivity implements ExitConfirmDialogFactory.OnExitDialogClickListener {
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
Bundle arguments = new Bundle();
if(mExitDialog==null) {
arguments.putInt(FragmentConstants.Arguments.DIALOG_ICON_ID_ARGUMENT, android.R.drawable.ic_dialog_alert);
arguments.putString(FragmentConstants.Arguments.DIALOG_MESSAGE_ARGUMENT, getString(R.string.message_exit));
arguments.putString(FragmentConstants.Arguments.DIALOG_TITLE_ARGUMENT, getString(R.string.title_exit_message));
DialogFragment exitDialog = new ConfirmationDialog();
exitDialog.setArguments(arguments);
mExitDialog = exitDialog;
}
mExitDialog.show(getSupportFragmentManager(),FragmentConstants.Tags.EXIT_DIALOG_TAG);
} else {
super.onBackPressed();
}
}
@Override
public void onConfirmClick() {
super.onBackPressed();
}
@Override
public void onCancelClick() {
}