从仅包含片段的活动退出



我的应用程序包含一个空活动和几个片段。活动的onCreateactivity_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);

最新更新