Android 用另一个背面按钮替换片段

Android 用另一个背面按钮替换片段,android,fragment,back-button,Android,Fragment,Back Button,我试图覆盖“后退”按钮,因为当我按下时,它将关闭我的应用程序,我有不同的片段: 片段A:索引(当我按下后退按钮时,它将关闭应用程序) 片段B(当我按下后退按钮时,它将返回片段A) 片段C(当我按下后退按钮时,它将返回片段A) 我有我的主要活动:它管理我的片段(因为我有一个导航抽屉) 我在这上面找到了很多帖子,但我无法实现它们: 以片段B为例: @Override public void onBackPressed(){ FragmentManager fm = getSupportF

我试图覆盖“后退”按钮,因为当我按下时,它将关闭我的应用程序,我有不同的片段:

  • 片段A:索引(当我按下后退按钮时,它将关闭应用程序)
  • 片段B(当我按下后退按钮时,它将返回片段A)
  • 片段C(当我按下后退按钮时,它将返回片段A)
我有我的主要活动:它管理我的片段(因为我有一个导航抽屉)

我在这上面找到了很多帖子,但我无法实现它们:

以片段B为例:

@Override
public void onBackPressed(){
    FragmentManager fm = getSupportFragmentManager();
    Fragment f = fm.findFragmentById(R.id.fragmentb); // get the fragment that is currently loaded in placeholder
    Object tag = f.getTag();
    // do handling with help of tag here
    // call super method
    super.onBackPressed();
}
它说无法解析onBackPressed()和getSupportFragmentManager(),我想我没有正确使用该方法,那么该怎么办

活动: @茱萸 我试过了,但没用:

    @Override
    public void onBackPressed(){
        Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.demande_gratuite);
        if (myFragment != null && myFragment.isVisible()) {
            AlertDialog alertDialog = new AlertDialog.Builder(this).create();
            alertDialog.setTitle("Reset...");
            alertDialog.setMessage("test");
            alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                }
            });
            alertDialog.show();
        }
        super.onBackPressed();
    }
}
@自主应用程序
这是我在片段之间导航时使用的:

MainActivity.java:

@Override
public void onBackPressed() {
    // note: you can also use 'getSupportFragmentManager()'
    FragmentManager mgr = getFragmentManager();
    if (mgr.getBackStackEntryCount() == 0) {
        // No backstack to pop, so calling super
        super.onBackPressed();
    } else {
        mgr.popBackStack();
    }
}
编辑第二个:请注意,如果您还没有处理它(例如,通过弹出片段管理器的backbackback),您只想调用
super.onBackPressed()

为此,您必须将新片段添加到
FragmentManager
的backbackback(
addToBackStack()
)中。例如(也在MainActivity.java中):

编辑第三个(7/28):
onCreate(Bundle)
方法中,通过调用
displayView(int)
方法执行第一个片段事务<代码>显示视图(int)始终将其片段事务添加到backbackback。这不是你想要的。第一个片段事务应该使用
fragmentTransaction.*add**(int,fragment)
,并且不应该调用
addToBackStack(String)
。第一个事务之后的每个事务都应该调用
fragmentTransaction.*replace**(int,Fragment)
,并且应该调用
addToBackStack(String)
。原因是您的第一个事务基本上是将一个片段(您的UI)“添加”到一个空容器中(它不是“替换”另一个片段)。当此事务处于backstack上时,这意味着空容器状态也处于backstack上。因此,当您弹出最后一个事务时,它会显示一个空白UI

编辑第一个:当您调用一个对象(通过调用获得)时,您正在将一个
FragmentTransaction
添加到
FragmentManager
s“backstack”中。我的代码所做的是通过调用来检查backbackback的大小。如果这个数字大于零,那么我们就知道在后台有
FragmentTransaction
s。在这种情况下,您可以调用,这将弹出后台的最后一个事务——换句话说,将您的应用程序返回到显示的最后一个片段

如果backback条目county等于0,则表示您在片段A,您应该调用
super.onBackPressed()
,这将导致应用程序退出。

onBackPressed()
getSupportFragmentManager()
是活动类中的方法,而不是片段,因此,您必须在活动而不是片段上实现这一点。 如果您只想为一个片段实现一个特定的行为,您可以检查当前可见的片段是什么,然后实现您的行为。像这样:

@Override
public void onBackPressed(){
    MyFragment myFragment =   (MyFragment)getFragmentManager().findFragmentByTag("YOUR_FRAGMENT");
    if (myFragment != null && myFragment.isVisible()) {
       // the code for whatever behaviour you want goes here
    }
    else
       super.onBackPressed();
}
另一种可能的、可能更简单的方法是在添加片段时激活的活动中使用一些标志,然后从
onBackPressed()
读取

根据对BENJY编辑的回应进行编辑

请注意,您并没有完全使用我发布的代码。您使用的是
findFragmentById()
,它并不适用于所有情况,我无法判断它是否适合您的代码。 您应该使用
findFragmentByTag
,它适用于任何类型的片段事务。 在执行事务时,只需在片段中添加一个标记,如下所示:

 getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment(), "FRAGMENT_TAG")
                    .commit();
然后,当您尝试在
onBackPressed()
中取回片段时,您会发现它正在寻找该标记:

PlaceholderFragment myFragment = (PlaceholderFragment) getSupportFragmentManager()
   .findFragmentByTag("FRAGMENT_TAG");

做出这样的改变,它必须起作用。

我知道现在回答这个问题已经太迟了,但是无论谁,访问这里,可能会得到帮助,我通过下面的方法实现了这一点

如果您想更改将活动保留在click on device back(单击设备后退)按钮上的片段,则上述所有代码都将用于删除第行下方的代码

super.onBackPressed()

您的活动有片段管理器(我认为还有
onBackPressed()
调用),而不是片段。@EpicPandaForce,但如果我将Override public void onBackPressed(){super.onBackPressed();}在MainActivity上,我将如何为不同的片段配置back按钮?@benjy想发布活动代码吗?@benjy正如两个答案所说,你没有在你的活动中覆盖onBackPressed。@milez我在这里做了:覆盖public void onBackPressed(){}我不明白第二个代码我在。。。什么是FragmentManager的后台见我的补充说明。如果你需要更多信息,请告诉我。你肯定应该阅读文档和Google开发者指南中的片段。我更改了我的示例,以反映你用于片段事务的代码。在自定义的
onBackPressed()
方法中,不要调用
super.onBackPressed()
,这一点非常重要,除非你在片段A上,想回到主屏幕。这就是为什么我把我的超级呼叫包装在一个
else
语句中。完美的解释!它看起来工作正常,但我有另一个问题,我可以从Accueil片段访问另一个片段,你知道如何做像导航这样的链接吗?请看一看这里:但是谢谢你抽出时间来!:)@benjy该代码已添加到您的活动类中,对吗?是的,请查找我所做的代码,并添加一条消息以查看其是否有效,但没有办法:)@benjy查看我的编辑。如果你改变我说的话,它就必须起作用。我试图确定
 getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment(), "FRAGMENT_TAG")
                    .commit();
PlaceholderFragment myFragment = (PlaceholderFragment) getSupportFragmentManager()
   .findFragmentByTag("FRAGMENT_TAG");
super.onBackPressed()