假設我們有動態片段的活動。有一些「根」片段,它是這樣添加的:使用無支持庫的片段實現導航
@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);
}
此代碼的工作。但是出現了一個問題。當我們按回根片段時,它只是從活動中消失,我們看到空的屏幕,並且需要再次按Back關閉應用程序。根據我寫的代碼我明白這是正確的行爲,我需要刪除addToBackStack
來修復它。但在這種情況下,主頁按鈕的實現將不起作用。
我看到的修補程序重寫onBackPressed
如下:
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 1) {
super.onBackPressed();
} else {
finish();
}
}
但似乎不自然。碎片應該使代碼更清潔,而不是像這樣。
那麼,該如何做到正確?我認爲這是一個典型的任務,可能這是一個愚蠢的問題。但在官方文檔中我只找到了one solution,它是關於支持庫,我不想使用它。
或者我的骯髒的黑客可以嗎?