2014-01-07 64 views
1

我正在編寫一個使用FrameLayoutFragments作爲其組件的Android應用程序。Android後退按鈕從背後帶來了錯誤的片段

我有3個片段:CommunityFragment,TaskFormFragmentTaskFragment

在CommunityFragment中,用戶按下按鈕以創建任務。然後TaskFromFragment替換FrameLayout中的CommunityFragment addToBackStack。因爲在那之後,我想用後退按鈕返回到CommunityFragment。

在TaskFormFragment中,用戶按下create按鈕創建任務。然後TaskFragment打開而不是addToBackStack,因爲我不想在按下後退按鈕時顯示TaskFormFragment。

所有這些工作都很完美。當我按下TaskFragment中的按鈕時,顯示CommunityFragment。但是,在那之後,如果我打開TaskFormFragment並按回按鈕,則不會顯示CommunityFragment!相反,它會打開TaskFragment。

這是怎麼發生的?這裏是我的片段過渡代碼:

CommunityFragmentTaskFormFragment

TaskFormFragment newFragment = new TaskFormFragment(); 
Bundle args = new Bundle(); 
args.putLong("taskTypeId", taskTypeId); 
args.putLong("communityId", community.getId()); 
newFragment.setArguments(args); 

FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.replace(R.id.frame_container, newFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

TaskFormFragmentTaskFragment

TaskFragment newFragment = new TaskFragment(); 
Bundle args = new Bundle(); 
args.putLong("taskId", task.getId()); 
newFragment.setArguments(args); 

FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.replace(R.id.frame_container, newFragment); 
transaction.commit(); 

編輯:我找到了soluti在此條目中:Problems with Android Fragment back stack

回答

3

我發現在另一篇文章的解決方案。我添加了方法到我的活動類,它包含的FrameLayout:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     if (getSupportFragmentManager().getBackStackEntryCount() == 0) { 
      this.finish(); 
      return false; 
     } else { 
      getSupportFragmentManager().popBackStack(); 
      removeCurrentFragment(); 
      return false; 
     } 
    } 

    return super.onKeyDown(keyCode, event); 
} 


public void removeCurrentFragment() { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.detailFragment); 

    if (currentFrag != null) 
     transaction.remove(currentFrag); 

    transaction.commit(); 
} 

的描述和這個問題的解決方案是在這裏: Problems with Android Fragment back stack

1

一旦用戶在任務片段中按下並返回到社區片段,則應清除您的後臺堆棧。您的問題是,它不會被清除,所以當您按回去以前的交易。

編輯:

所以,你的社區片段之前被替換運行這個

for(int i =0;i<fragmentmanager.getBackStackEntryCount();i++){ 
fragmentmanager.popbackstack(); 
} 

看看是否能解決它

+0

但我沒加TaskFragment到堆棧中?所以我甚至沒有給它命名。我怎樣才能清除它? – sedran

+0

檢查更新的答案 –

+0

問題在於TaskFragment替換爲CommunityFragment。我沒有添加TaskFragment到後臺堆棧。它從TaskFormFragment返回到TaskFragment,它從Backstack中移除CommunityFragment。我無法回到它。 – sedran