我只有一个活动在我的应用程序中有多个片段.每当用户打开应用程序,它以startupFragment
开始.每当用户浏览片段并按下返回,它带他回到startupFragment
.但当在startupFragment
,我希望用户,当点击返回,能够关闭应用程序.现在,这里是代码,当应用程序启动以创建片段时。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Set starting fragment
StartupFragment startupFragment = new StartupFragment();
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().add(R.id.content_main, startupFragment, "startupFragmentTag").commit();
}
字符串
正如你所看到的,我添加了标签"startupFragmentTag"
来识别它。这是我在BackPressed上的代码:
@Override
public void onBackPressed()
{
Fragment startup = getFragmentManager().findFragmentByTag("startupFragmentTag");
if(startup == null) {
android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
StartupFragment startupFragment = new StartupFragment();
manager.beginTransaction().replace(R.id.content_main, startupFragment, "startupFragmentTag").commit();
} else {
finish();
}
}
型
所以基本上我在这里尝试的是,当用户在另一个片段中时,当用户按回时,它会把他/她带回到startupFragment
。但是当在那个片段中时,当再次按回时,我希望用户能够退出应用程序,这在代码中不会发生。
我通过标签找到startupFragment
并检查它是否存在。如果不存在,它将把用户带回它。但是如果它存在,用户应该能够退出,这就是为什么调用finish()
。
以前的碎片不会被销毁吗?但不应该是这样,因为即使我打开应用程序并立即按下返回,它也不会退出应用程序。
我做错了什么?
3条答案
按热度按时间92dk7w1h1#
看起来您需要做的就是将每个Fragment添加到每个FragmentTransaction的回栈中,然后从
onBackPressed()
的回栈中弹出每个Fragment。首先,修改
onCreate()
,使其在每个事务上调用addToBackStack()
:字符串
然后,在
onBackPressed()
中,如果你不在起始Fragment上,只需从back堆栈弹出。如果你在起始Fragment上,并且back被按下,只需调用super.onBackPressed()
,这将退出应用程序:型
egmofgnx2#
您正在使用片段,因此要完成应用,您需要完成父Activity。
尝试以下操作以完成startupfragment中的Activity:
字符串
kokeuurv3#
可能是因为你已经使用
beginTransaction().add()
添加了包括startupFragment
和其他Fragment在内的Fragment,然后你将总是能够使用getFragmentManager().findFragmentByTag()
找到它,因为所有添加的Fragment都将在Fragment堆栈中(而find方法实际上是在堆栈中找到带有标签的Fragment)。根据您想要实现的内容提供提示:
beginTransaction().replace()
将替换而不是添加一个Fragment,这样,如果你总是替换它,你将只能“找到”一个现有的Fragment。1.如果堆栈中有几个Fragment被添加而不是如上所述被替换,您可能希望使用
getFragmentManager().findFragmentById()
来获取当前显示的Fragment(在Fragment堆栈的顶部),而不是findFragmentByTag
。1.当使用
beginTransaction().add()
时,你可能想使用fragmentManager.addOnBackStackChangedListener()
来监视Fragment堆栈的变化。那么你可能就不必处理onBackPressed()
了。然后在监听器中,你只需要在顶部堆栈上检索当前的Fragment,看看它是什么,然后在那里添加你的逻辑。