安卓系统中,如何检查返回按钮是否被按下?

3
我正在开发一个回合制游戏应用程序。每个回合后,它会从视图中显示当前轮到谁的提示信息。 但是,如果我按下返回按钮,它将返回到主菜单(上一个活动),但是提示信息仍然会持续显示直到超时。如果我按两次返回键并返回到主屏幕,提示信息将一直显示,直到它们完成。我想实现一个检查或某种方式,在按下返回按钮时取消这些提示信息。我必须在我的视图中执行此操作,我的视图包含所有提示信息和游戏代码,而gameActivity仅具有onCreate以为游戏创建视图。有什么想法吗?

你看过使用 onBackPressed() 了吗? - panini
是的,我尝试使用了这个方法,它可以让活动退出到上一个页面,但问题是我无法让 Toast 消失,即使你返回两次回到主页,Toast 仍然存在。 - BBish937
在你的onBackPressed()方法中取消你的Toast。 - panini
6个回答

7

在您的Activity中,您重写了以下方法:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // do something
        yourView.notifyBackPressed();
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

在您的视图中,您需要实现一个方法,例如notifyBackPressed()


public notifyBackPressed(){ myToast.cancel(); } 公共通知返回按键被按下(){ 我的提示框取消(); } - Sergey Neskoromny
当然,Toast myToast = new Toast(YourActivity.this); 必须在您的视图中全局定义。 - Sergey Neskoromny
它确实能够工作,但我的问题是可能只有6个中的1个toast显示出来,因此当我将其分解为第一个时,它会在backPressed上取消toast。然而,我必须考虑所有情况,当我在onBackPressed方法中列出所有的.cancels时,对于那些不存在的部分,我会得到nullpointer异常,我无法解决这个问题。 - BBish937
我已成功解决这个问题,方法是将它们初始化为 null 并将其设置为全局变量,然后在需要创建 toast 时进行覆盖。所以我的 onBackPressed 方法会进行 null 检查,如果它们不为空,则取消 toasts。现在当按下返回键时,toasts 实际上会被取消,并且我不会得到任何空指针异常。非常感谢,这确实可行! - BBish937
1
是的,HOME按钮的工作方式与BACK按钮不同,但您可以在Activity的onPause()方法中调用yourView.notifyBackPressed()来实现相同的效果。 - Sergey Neskoromny
显示剩余4条评论

0
我尝试以下两种方法来检测活动栏中的返回按钮按下情况,第一种方法是用来检测移动设备硬件的返回或退出活动按钮。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public void onBackPressed() {
    setResult(RESULT_CANCELED);
    super.onBackPressed();
}

0
  1. 生成Toast

    Toast toast;
    toast = Toast.makeText(getBaseContext(), "消息", Toast.LENGTH_LONG);
    toast.show();
    
  2. 取消Toast,您可以使用onKeyDown()或onBackPressed()。

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
    
        toast.cancel();
        return true;
    }
    
    return super.onKeyDown(keyCode, event);
    

    }


尝试过了,一切都运行良好,但是当返回键被触发后,Toast 仍然停留在屏幕上。 - BBish937

0
//Try with making Toast Global and cancel the toast on Back Pr 
Toast mToast = new Toast(ApplicationContext);

public void onBackPressed(){
    mToast.cancel();
}

尝试了多个方面,仍然无法清除后台残留的提示信息。 - BBish937
如果仍然无法正常工作,请尝试使用警报对话框制作自己的吐司。 - Abhishek

0

试试这个...

尝试使用 Toast.LENGTH_SHORT 或者 你可以像这样为自定义 Toast 设置持续时间(毫秒)。 自定义 Toast: LayoutInflater inflater = getActivity().getLayoutInflater(); View layoutToast = inflater.inflate(R.layout.custom_toast_layout, (ViewGroup) getActivity().findViewById(R.id.toastcustom));
((TextView) layoutToast.findViewById(R.id.texttoast)).setText("我是自定义 Toast"); final Toast myToast = new Toast( (EmployerNominationView) getActivity()); myToast.setView(layoutToast); myToast.setDuration(300); myToast.setGravity(Gravity.BOTTOM, 0, 45); myToast.show(); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { myToast.cancel(); } }, 1000);

是的,问题在于我需要我的吐司长一点,这样游戏才能正常显示。我使用处理程序让机器人花更长时间来进行他们的回合,以便我的吐司具有LENGTH.LONG,以匹配机器人玩耍所需的时间。这样它看起来就像他在思考,会说“机器人的回合...”,然后吐司持续时间恰好在机器人移动时结束。如果我缩短它,机器人就会玩得太快了。我不想改变我的吐司。我想尝试在吐司之后添加一个onBackButton按下检查,这样当它正在显示时,如果按下该按钮,它将取消吐司。 - BBish937

0

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