Android重写onBackPressed()

69

是否可以仅在一个活动中重写 onBackPressed()

当按下后退按钮时,我想在特定的活动上调用对话框,但是在所有其他活动中,我希望它像以前一样工作(返回到先前的活动)。

编辑

谢谢大家的答案,我已经按照你们告诉我的做了一切,但我的问题是当我在另一个活动中单击“返回”按钮时,我会返回到之前的活动(其中我重写了后退按钮),我认为它没有起作用,我认为它正在覆盖整个应用程序中的onBackPressed(),现在我明白了。


请参考此处:https://dev59.com/Q3A75IYBdhLWcg3wuLnD#3142471 - CRUSADER
10个回答

156

是的。只需要在那个Activity中进行覆盖

@Override
public void onBackPressed()
{
     // code here to show dialog
     super.onBackPressed();  // optional depending on your needs
}

不要把这段代码放在任何其他Activity


3
以上代码在片段中如何工作?有什么解决方案吗? - Ganesh Katikar
你好,我有一个类似的问题。我的 Activity 2 正在跳转到 Activity 1,但如果我在 Activity 2 上点击返回键,我不想再回到 Activity 1,而是希望退出应用程序。请问该如何实现? - Tabish khan
@Tabishkhan 在启动活动2的意图后,只需在活动1上调用 finish()。然后,活动2将是堆栈中唯一的活动。 - codeMagic
@UnKnown 创建一个活动来扩展您的其他活动,并将代码放在该超级活动中。 - codeMagic
如果对所有内容执行相同的操作,最理想的情况是它包含完成所需的所有内容。您最好创建一个带有相关代码和未按预期工作的部分的问题。可能有更好的方法,但这是我的第一想法。 - codeMagic
显示剩余5条评论

44

按照codeMagic的示例覆盖重写onBackPressed()方法,并在不希望执行默认操作(结束当前活动)时删除对super.onBackPressed();方法的调用。


5

OnBackPressed已弃用。

这里提供Kotlin解决方案:

onBackPressedDispatcher.addCallback(object: OnBackPressedCallback(true) {
            /* override back pressing */
            override fun handleOnBackPressed() {
                //Your code here
            }
        })

1
此答案提供了 Android 13 (SDK 33) 引入的新方法。您可以在 stackoverflow - onBackPressed() deprecated, What is the alternative? 中找到更多细节,并在 Medium - How To Migrate The Deprecated OnBackPressed Function 中找到迁移指南。 - Aaron

5
你可以调用onBackPressed()方法,如果你想在返回按钮后显示某个活动,则需要提及它。
Intent intent = new Intent(ResetPinActivity.this, MenuActivity.class);
    startActivity(intent);
    finish();

那对我有用。


2

只需在初始化字段时使用以下代码

private int count = 0;
    @Override
public void onBackPressed() {
    count++;
    if (count >=1) {
        /* If count is greater than 1 ,you can either move to the next 
        activity or just quit. */
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
        finish();
        overridePendingTransition
        (R.anim.push_left_in, R.anim.push_left_out);
        /* Quitting */
        finishAffinity();
    } else {
        Toast.makeText(this, "Press back again to Leave!", Toast.LENGTH_SHORT).show();

        // resetting the counter in 2s
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                count = 0;
            }
        }, 2000);
    }
    super.onBackPressed();
}

2
只需在您想要显示对话框的活动中调用onBackPressed()方法,并在其内部显示您的对话框。

0

试一下,它能正常工作

  @Override
public void onBackPressed(){
        super.onBackPressed();
         Intent i=new Intent(Intent.ACTION_MAIN);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        finish();
}

0
一个简单的 Kotlin 解决方案, 在下面创建一个扩展函数
fun Fragment.onBackPressed(
    navigateToHomeGraph: () -> Unit
) {
    val onBackPressedDispatcher = requireActivity().onBackPressedDispatcher
    onBackPressedDispatcher.addCallback(
        viewLifecycleOwner,
        object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                navigateToHomeGraph()
            }
        }
     )
}

现在你可以在你的Fragment中调用这个方法,并传入你想要的目的地。
onBackPressed {
    findNavController().navigate(R.id.destination_nav_graph)
}

0

控制音乐的最佳和最通用的方法是创建一个母活动,在其中覆盖startActivity(Intent intent) - 在其中放置shouldPlay=true, 和onBackPressed() - 在其中放置shouldPlay = trueonStop - 在其中放置一个有条件的mediaPlayer.stop,其条件为shouldPlay。

然后,只需将母活动扩展到所有其他活动中,无需重复编写代码。


0

首先,您必须考虑一下,如果您的活动(我称之为A)扩展了另一个活动(B),并且在这两个活动中,您都想使用onbackpressed函数,则B中的所有代码也会在A中运行。因此,如果您想要将它们分开,您应该将它们分开。这意味着A不应该扩展B,然后您可以为它们每个人单独拥有onbackpressed。


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