我的应用程序包含一个空活动和几个片段。活动的onCreate
将activity_main.xml
中的空视图替换为包含一些按钮的MainFragment
。每个按钮启动一个单独的片段,用户可以从一个片段导航到另一个片段,等等。
按下后退键时,当前片段将正确替换为上一个片段,直到您到达MainFragment
。当用户从MainFragment
按回时,它会隐藏主片段,您会看到主活动的白色空背景。但我想在这一点上退出活动,因为这将是明智的行为。
如果片段管理器中没有剩余片段,我可以通过从onBackPressed第二次调用super.onBackPressed((来实现这一点。
@Override
public void onBackPressed() {
super.onBackPressed();
FragmentManager manager = getSupportFragmentManager();
List<Fragment> fragments = manager.getFragments();
if (fragments == null || fragments.size() == 0) {
Log.d(TAG, "No more fragments: exit");
super.onBackPressed();
}
}
这是可以接受的事情吗 - 它会在活动工作流中产生任何问题吗?有没有更好/标准的方法来处理这种情况?
没有问题,但是如果您将主片段添加到活动中时不调用.addToBackStack()
您实际上不需要覆盖活动中的onBackPressed
,这可能会更容易。我建议实现一种在活动中添加片段的方法:
protected void addFragment(Fragment fragment, boolean addToBackStack) {
String tag = fragment.getClass().getName(); //It's optional, may be null
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction()
.add(R.id.your_container_id, fragment, tag);
if (addToBackStack) {
transaction.addToBackStack(tag);
}
transaction.commit();
}
并修改您的onCreate
活动方法,如以下代码片段所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
// Add your fragment only if it is a first launch,
// otherwise it will be restored by system
addFragment(new YourFirstFragment(), false);
}
}
对于所有其他片段,请使用:
addFragment(new OtherFragment(), true);