我的应用程序中只有一个活动有多个片段。每当用户打开应用程序时,它都会以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"
以便能够识别它。这是我的代码onBackPressed:
@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()
的原因。
先前的碎片是否未被破坏?但情况并非如此,因为即使我打开应用程序并立即按回,它也不会退出应用程序。
我在这做错了什么?
答案 0 :(得分:1)
您正在处理片段,因此要完成您的应用,您需要完成父级活动。
尝试此操作以完成startupfragment中的活动:
getActivity().finish();
答案 1 :(得分:1)
看起来您需要做的就是将每个Fragment添加到每个FragmentTransaction的后堆栈中,然后在onBackPressed()
中从后堆栈中弹出每个Fragment。
首先,修改onCreate()
,以便在每次交易时调用addToBackStack()
:
@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")
.addToBackStack(null)
.commit();
}
然后,在onBackPressed()
中,如果你不在起始片段上,只需从后面的堆栈中弹出。如果你在启动片段上,然后按下后退,只需拨打super.onBackPressed()
,即可退出该应用:
@Override
public void onBackPressed() {
android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 1) {
//Go back to previous Fragment
fragmentManager.popBackStackImmediate();
} else {
//Nothing in the back stack, so exit
super.onBackPressed();
}
}
答案 2 :(得分:0)
可能是因为您已使用beginTransaction().add()
在其上添加包含startupFragment
和其他片段的片段。然后你总是能够使用getFragmentManager().findFragmentByTag()
找到它,因为添加的所有片段都在Fragment堆栈中(而find方法实际上是在堆栈中找到带有标记的Fragment)。
根据您想要的内容提示:
beginTransaction().replace()
将取代而不是添加片段,这样您就只能找到"一个现有的片段,如果你总是替换它。即在堆栈中始终是一个片段。getFragmentManager().findFragmentById()
获取当前显示片段(位于片段堆栈顶部),而不是findFragmentByTag
,如果堆栈中有多个片段未添加如上所述替换。beginTransaction().add()
时,您可能希望使用fragmentManager.addOnBackStackChangedListener()
来监视Fragment堆栈更改。然后你可能不必处理onBackPressed()
。然后在监听器中你只需要在顶层堆栈上检索当前的Fragment并查看它是什么并在那里添加你的逻辑。