2016-05-13 128 views
2

我試圖在使用片段時實現後端堆棧,但是當使用「後退」按鈕時,我一直在將應用程序移出主屏幕。實現與片段的後端堆棧

活動打開片段A;片段A有一個可點擊的TextView打開片段B(這是可行的)。點擊BACK應該會將我返回到片段A,但它會將我帶到主屏幕。

這裏是活動的號召,片段A的onCreate開口道:

FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.add(R.id.fragment_layout_container, new FragmentLogin(), "fragment_login") 
      .addToBackStack("login_screen") 
      .commit(); 

    Log.d("Back", getFragmentManager().getBackStackEntryCount() +" <- Entry Count at LoginActivity.onCreate"); 

在這一點上,日誌打印0 <- Entry Count at LoginActivity.onCreate。這是我做錯了從打印1.

然後保持此,該片段A有這個監聽器:

forgottenPassword.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
      fragmentTransaction.replace(R.id.fragment_layout_container, new FragmentForgottenPassword(), "fragment_password") 
        .addToBackStack("forgotten_password") 
        .commit(); 

      Log.d("Back", getFragmentManager().getBackStackEntryCount() + " <- Entry Count at FragmentLogin.onCreateView.Listener"); 
     } 
    }); 

日誌這裏打印1 <- Entry Count at FragmentLogin.onCreateView.Listener。在這裏,偵聽器工作並打開片段B - 但後退按鈕將我返回到主屏幕。

回答

2

使用此在您的活動應該跳出片段已添加到堆棧中

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

嘗試像這樣,

public void replaceFragment(Fragment fragment, boolean addToBackStack) { 

    FragmentTransaction transaction = getFragmentManager() 
      .beginTransaction(); 

    if (addToBackStack) { 
     transaction.addToBackStack(null); 

    } else { 
     getFragmentManager().popBackStack(null, 
       FragmentManager.POP_BACK_STACK_INCLUSIVE); 

    } 
    transaction.replace(R.id.fragment_layout_container, fragment); 
    transaction.commitAllowingStateLoss(); 
    getFragmentManager().executePendingTransactions(); 

} 

,並用它這樣的,

replaceFragment(new FragmentForgottenPassword(), true); 
0

有一個GitHub的庫,會爲你做這項工作!
https://github.com/rathodchintan/Fragment-Back-Stack
無論何時顯示任何新的片段,只需使用以下代碼將該片段推入堆棧即可。 //這裏這個片段是我們的第一個片段
homeListFragment = new HomeListFragment(); fragmentStack.push(homeListFragment);
它也有許多其他堆棧選項。