2013-12-23 20 views
2

假設我們有動態片段的活動。有一些「根」片段,它是這樣添加的:使用無支持庫的片段實現導航

@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,它是關於支持庫,我不想使用它。

或者我的骯髒的黑客可以嗎?

回答

0

我正在處理我的項目中的類似任務,我認爲你的「破解」是可以的:因爲根Activity本身可能有佈局,所以彈出最後一個碎片堆棧狀態將導致Activity處於初始狀態。我認爲這種情況很常見,並且您的根Activity沒有佈局的事實只是一個特例。我的情況,如果你感興趣:

@Override 
public void onBackPressed() { 
    if (fragmentManager.getBackStackEntryCount() <= (Const.isTablet ? 3 : 2)) { 
     Utils.getStyledAlertDialogBuilder(this, R.string.confirm_finish) 
       .setIcon(R.drawable.ic_app) 
       .setNegativeButton(R.string.cancel, null) 
       .setPositiveButton(R.string.finish, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         finish(); 
        } 
       }) 
       .show(); 
     return; 
    } 
    super.onBackPressed(); 
} 
相關問題