【问题标题】:How to check if the back button was clicked如何检查是否单击了后退按钮
【发布时间】:2026-01-28 13:20:05
【问题描述】:

我有一个带有按钮的应用程序。 (见图)。仅当用户未激活某个设置时才会出现此预览。如果他按下按钮,他就会进入设置。如果他按回去,他就会回到设置。我现在想拦截这个“后退”。
这个后退按钮直接在智能手机上。如何拦截此活动?我找到了一些东西,不幸的是它没有给我这个。我有什么问题吗?还是有别的东西?提前致谢。

  public class NfcSettingActivity extends AppCompatActivity {

    private Dialog epicDialog;
    private Button btn_nfc_navigate_setting;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_nfc_setting);
        btn_nfc_navigate_setting = findViewById(R.id.btn_nfc_navigate_setting);
        btn_nfc_navigate_setting.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(Settings.ACTION_NFC_SETTINGS));
            }
        });

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        System.out.println("back pressed");
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            onBackPressed();
        }
        return super.onKeyDown(keyCode, event);
    }
}

【问题讨论】:

  • 在没有工作覆盖???
  • Activity 还是Fragment
  • 您正在使用 println。您需要改用日志。像这样:Log.d("some tag", "some message"); 了解更多信息,请访问:developer.android.com/studio/debug/am-logcat
  • 我按下按钮并跳转到 NFC 设置。如果我现在按下返回按钮,我会回到之前的屏幕。不幸的是,它并没有告诉我他执行了这个方法 onBackPressed () 。所以他不做这个方法。
  • 所以该方法的工作原理是这样的,只要我从窗口中按下后退按钮,它就会执行它。但是当我按下设置的后退按钮时,什么也没有发生。我想要一个方法来告诉我它是否来自这个后退按钮。

标签: java android nfc activity-lifecycle onbackpressed


【解决方案1】:

我是这样理解你的问题的:

NfcSettingActivity 仅在某个设置(可能是 NFC)未激活时显示。如果未设置,用户可以在 Activity 中单击您的按钮,并将用户带到 Android 的 NFC 设置。激活后,用户单击返回按钮并将他/她带回NfcSettingActivity。此时,您想知道 NFC 设置是否已成功激活。

这是您需要做的:您不需要按下返回按钮。您需要做的是再次检查NfcSettingActivity 是否处于已恢复 状态。在NfcSettingActivity 中,您需要具备以下条件:

@Override
protected void onResume() {
    super.onResume();

    // Do your NFC checking here!
    // Also, you might need to add a flag here to check if the user has been to the NFC Setting page already!
}

Understand the Activity Lifecycle

【讨论】:

  • 天啊!非常感谢!我的方法不对!难怪它不起作用。非常感谢您抽出宝贵时间。
  • 这不是一个很好的尝试检测用户是否打开 NFC 的方法,因为如果不是单击按钮启动Settings.ACTION_NFC_SETTINGS,用户会转到快速设置以打开 NFC相反,您 NfcSettingActivity 永远不会暂停,因此不会恢复。使用广播接收器检测 NFC 设置状态变化要好得多。
  • 确实如此。 OP 需要考虑这种情况。但是,此答案仅适用于 OP 特别希望将用户带到 NFC 设置页面而不是快速设置这一事实。
【解决方案2】:

可能您忘记添加super.onBackPressed()

override fun onBackPressed() {
    ...
    super.onBackPressed()
}

更新

或许你应该使用onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

甚至可能是onKeyDown:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        onBackPressed();
    }
    return super.onKeyDown(keyCode, event);
}

【讨论】:

  • @FischerKlaus,见*.com/questions/39532594/…。您是否在代码中使用过onKeyDownonKeyUp?还是onOptionsItemSelected
  • 不,我没有使用它!我会检查问题。谢谢
  • 非常感谢。尝试了新的答案。不幸的是,它仍然不起作用。 :(
  • 我编辑了我的问题。也许如果有更多错误。
【解决方案3】:

在调用 super.onBackPressed(); 之前尝试在后按上写下你想要的东西在被覆盖的方法 onBackPressed()

@Override
public void onBackPressed() {
    System.out.println("back pressed");
    super.onBackPressed();
}

也可以用 log 代替 println("")

【讨论】: