使用没有支持库的片段实现导航

时间:2013-12-23 14:49:31

标签: android android-fragments android-actionbar

假设我们有动态片段的活动。有一些“根”片段,它添加如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
            .replace(R.id.container, new RootFragment())
            .addToBackStack("root")
            .commit();
    }
}

还有一些其他片段,根据某些逻辑替换此根片段。我们希望在ActionBar上实现主页按钮,这允许我们从任何片段转到根。因此,我们在活动中调用getActionBar().setDisplayHomeAsUpEnabled(true);并覆盖onOptionsItemSelected

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    FragmentManager fm = getFragmentManager();

    switch (id) {
        case android.R.id.home:
            fm.popBackStack("root", 0);
            return true;
        …
    }
    return super.onOptionsItemSelected(item);
}

此代码有效。但是出现了一个问题。当我们按回Root片段时,它只是从活动中消失,我们看到空屏幕,需要再次按回来关闭应用程序。根据我编写的代码,我理解这是正确的行为,我需要删除addToBackStack来修复它。但在这种情况下,主页按钮实现将不起作用。

我看到的修复程序覆盖了onBackPressed,如下所示:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 1) {
        super.onBackPressed();
    } else {
        finish();
    }
}

但这似乎不自然。片段应该使代码更清晰,而不是像这样。

那么,如何做到正确?我认为这是典型的任务,可能是一个愚蠢的问题。但是在官方文档中,我发现只有one solution,它是关于支持库的,我不想使用它。

或者我的脏黑客行为还好吗?

1 个答案:

答案 0 :(得分:0)

我正在处理项目中的类似任务,在我看来你的“hack”是可以的:因为root Activity本身可能有布局,弹出最后一个片段backstack状态将导致显示{{1}在它的初始状态。我认为这种情况很常见,而且你的根Activity没有布局这一事实只是一个特例。我的情况,如果你感兴趣:

Activity