假设我们有动态片段的活动。有一些“根”片段,它添加如下:
@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,它是关于支持库的,我不想使用它。
或者我的脏黑客行为还好吗?
答案 0 :(得分:0)
我正在处理项目中的类似任务,在我看来你的“hack”是可以的:因为root Activity
本身可能有布局,弹出最后一个片段backstack状态将导致显示{{1}在它的初始状态。我认为这种情况很常见,而且你的根Activity
没有布局这一事实只是一个特例。我的情况,如果你感兴趣:
Activity