2017-09-15 103 views
0

我正在使用android應用程序。我面臨的問題就像在後面的堆棧歷史記錄中添加碎片。讓我解釋清楚,我想從片段A導航到片段B,然後使用片段B中的按鈕單擊返回到片段A.上面的場景工作良好,在此導航到片段A後,當我點擊設備中的後退箭頭時導航到片段B.我不希望發生這種情況。給我一個解決方案。我的代碼結構如下:在android中通過片段導航而不將其添加到後臺堆棧

片段A:

....... 
FragmentB fragmentB = new FragmentB(); 
showFragmentOmitStack(fragmentB); 
.... 


public void showFragmentOmitStack(Fragment fragment) { 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.add(R.id.container,fragment);//add // replace 
transaction.addToBackStack(null); 
transaction.commit(); 
} 

片段B:

FragmentA fragmentA = new FragmentA(); 
showFragment(fragmentA, "FragmentA"); 


public void showFragment(Fragment fragment, String back_stack_name) { 
FragmentManager fragmentManager = thisActivity.getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.add(R.id.container, fragment); 
fragmentTransaction.addToBackStack(back_stack_name); 
fragmentTransaction.commit(); 
} 

在我的活動Java文件:

@Override 
public void onBackPressed() { 
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
if (drawer.isDrawerOpen(GravityCompat.START)) { 
    drawer.closeDrawer(GravityCompat.START); 
    } else { 
    if (getFragmentManager().getBackStackEntryCount() == 0) { 
     showAlertDialog(Constants.EXIT_APP, Constants.APP_NAME); 
    } else { 
     getFragmentManager().popBackStackImmediate(); 
      } 
     } 
    } 
+0

當您單擊B片段的按鈕,不添加新的片段A,只是彈出堆棧中。你做這件事的方式就是成爲A B A. – ElDuderino

回答

0

如果你不打算回退到前一個片段,只是在添加片段時不要將片段添加到backStack,即刪除t他:

fragmentTransaction.addToBackStack(myFragmentName); 

每個片段都有它自己的事務,所以當你添加一個與addToBackStack,那reffering到片段!在B片段交易中,您將其設置爲無效,您說B不會進入後面。所以後臺堆棧中唯一受後端壓力影響的片段是A!

+0

是的,我把它做成了空的transaction.addToBackStack(null);當從片段A到片段B調用時。 –

+0

我想要片段B不要在backStack中添加 –

+0

不!每個片段都有它自己的事務,所以當你使用addToBackStack添加A時,這就是片段A!在片段B事務中,您將其設置爲空,您說B不會進入backStack。所以後臺中唯一會受到後臺壓力影響的片段是A! – Ricardo

0

在那感動你回片段A從那裏只是刪除

yourTransaction.addToBackStack(空),您已經在片段B設置按鈕點擊事件;

你應該很好走。

0

如果你只有兩個片段,A和B的工作,那麼你可以做這樣的事情:

在你活動

@Override 
public void onBackPressed() { 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
    drawer.closeDrawer(GravityCompat.START); 
    } 
    else if (currentFragment instanceOf FragmentB) { 
    Fragment fragmentA = new FragmentA(); 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = 
    fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.container, fragmentA); 
    fragmentTransaction.commit(); 
    currentFragment = fragmentA; 
    } 
    else { 
     super.onBackPressed(); 
     } 
    } 
} 

而不是向後退堆棧的,只需在你的課堂上創建一個實例變量:Fragment currentFragment = null;。然後保持設置currentFragment到你開始的片段。

0

試試這個:

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
     getSupportFragmentManager().popBackStack(); 
    }else { 
     if (drawerLayout.isDrawerOpen(GravityCompat.START)) { 
      drawerLayout.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 
} 
相關問題