在Android中,如何要求用户在返回键按下时退出应用程序?

4
我有一个应用程序的活动列表。
如果用户在主页活动上,将会出现一条toast提示“请再按一次退出”。
但是,如果用户导航到第二或第三个活动,然后再回到主页活动,我的代码无法显示toast提示。
我希望每次用户在主页活动上时都会出现toast提示。
我知道我的逻辑存在一些错误。能否有人帮助我解决这个问题。
这是返回按钮的代码。
    @Override
    public void onBackPressed() {
    i++;
    if (i == 1) {
        Toast.makeText(HomeActivity.this, "Press back once more to exit.",
                Toast.LENGTH_SHORT).show();
    } else if(i>1) {
        finish();
        super.onBackPressed();
    }
}

它是否直接退出,而不显示提示信息?还是它只是没有响应? - DroidDev
1
我不知道你的活动在做什么,但是为什么要强制用户按两次返回键呢...这将是最烦人的事情。 - Martin Marconcini
7个回答

11

这是我如何实现“返回键退出”的方法,并且它总是有效的。它还通过在用户按下两次返回键之间等待3秒钟来处理意外的返回操作,如果用户在3秒内再次按下返回键,则退出应用程序。

private boolean exit = false;
@Override
public void onBackPressed() {
    if (exit)
        Home.this.finish();
    else {
        Toast.makeText(this, "Press Back again to Exit.",
                Toast.LENGTH_SHORT).show();
        exit = true;
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                exit = false;
            }
        }, 3 * 1000);

    }

}

使用此解决方案与片段时,请注意:您需要检查后退堆栈,因为它可能在3秒钟内发生变化(用户前进)。 - undefined

5

当你返回到HomeActivity时,必须设置i = 0

因此,在你的HomeActivity.java中,在OnResume()函数内设置i = 0

像这样:

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    i = 0;
} 

1
一个使用snackbar的简单而不错的解决方案。
LinearLayout mLayout;
Snackbar mSnackbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mLayout = findViewById(R.id.layout_main);
    mSnackbar = Snackbar.make(mLayout,"Press again to exit", Snackbar.LENGTH_SHORT);
}

@Override
public void onBackPressed() {
    if (mSnackbar.isShown()) {
        super.onBackPressed();
    } else {
        mSnackbar.show();
    }
}

1

好的,无论何时你调用另一个Activity,你需要在HomeActivity中的每个startActivity(xyz)之前设置i=0。我认为这应该可以解决你的问题,如果不能,请告诉我。


0

逻辑:

  1. 创建一个初始值为0的变量

  2. 在显示toast后将值设置为1,这样如果再次按下该值就可以进入if语句

  3. 创建一个带有指定延迟的处理程序,以便如果用户在指定时间内没有再次按下返回键,则将值更改为0,从而防止进入IF条件。

int x = 0;

 @Override
 public void onBackPressed() {

    if(x==1) {
        super.onBackPressed();
        return;
    }
    Toast.makeText(this,"Press Again to Exit!!",Toast.LENGTH_SHORT).show();
    x=1;

    android.os.Handler handler=new android.os.Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            x = 0;
        }
    }, 2000);  //2 sec delay

}

请解释一下这段代码的作用以及它是如何解决问题的。 - Michael Z.

0

homeActivityonBackPressed方法中使用AlertDialogBox,并在按下Yesfinish()该活动。

  @Override
public void onBackPressed()
{
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Exit");
    builder.setMessage("Are You Sure?");

    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    finish();
            }
        });

    builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

0

我建议在这种情况下使用警报弹出窗口。 但是在您的代码中,它也可以按以下方式工作:

int i = 1;


@Override
        public void onBackPressed() {       
            if (i == 1) {
                Toast.makeText(getApplicationContext(), "Press back once more to exit.",
                        Toast.LENGTH_SHORT).show();


            } else if(i>1) {
                finish();
            }
            i++;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接