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)
@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()