在按下后退button上的片段活动是空白的

我有一个活动和许多片段膨胀在同一个FrameLayout

 <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> 

例如:mainActivity>任何片段(按回button)>活动是空白的。

在onCreate:

 layout = (FrameLayout)findViewById(R.id.content_frame); layout.setVisibility(View.GONE); 

当我开始一个片段:

 FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content_frame, profileFragment); ft.addToBackStack(null); ft.commit(); layout.setVisibility(View.VISIBLE); 

我想我需要使frameLayout的可见性GONE再次按下,但我该怎么做?


我尝试onBackPressed并设置layout.setVisibility(View.GONE); 但我不能通过片段回去,因为我直接进入主页面。

如果在活动中使用了多个片段,或者即使只有一个片段,那么第一个片段也不应该有addToBackStack定义。 由于这允许后退导航,并且在这个片段之前将显示空的活动布局。

  // fragmentmaganer.addToBackStack() // dont include this for your first fragment. 

但是对于其他片段,您需要定义其他片段,否则后面将不会导航到较早的屏幕(片段),而是应用程序可能会closures。

回复晚了非常抱歉。

您不必添加ft.addToBackStack(null); 同时添加第一个片段。

 FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content_frame, profileFragment); // ft.addToBackStack(null); --remove this line. ft.commit(); // ... rest of code 
 @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { int fragments = getSupportFragmentManager().getBackStackEntryCount(); if (fragments == 1) { finish(); } else { if (getFragmentManager().getBackStackEntryCount() > 1) { getFragmentManager().popBackStack(); } else { super.onBackPressed(); } } } } 

添加一个片段

  getSupportFragmentManager().beginTransaction() .replace(R.id.layout_main, dashboardFragment, getString(R.string.title_dashboard)) .addToBackStack(getString(R.string.title_dashboard)) .commit(); 

你可以覆盖onBackPressed并检查是否有任何在后台堆栈。

 @Override public void onBackPressed() { int fragments = getFragmentManager().getBackStackEntryCount(); if (fragments == 1) { // make layout invisible since last fragment will be removed } super.onBackPressed(); } 

如果您希望在第一个片段上按下返回button时结束活动,则irscomp的解决scheme将起作用。 但是如果你想跟踪所有的片段,并且按照顺序从一个片段到另一个片段,那么你可以把所有片段添加到堆栈中:

 ft.addToBackStack(null); 

然后将此添加到onCreate()的末尾,以避免在最后一次按下时出现空白屏幕; 您可以使用getSupportFragmentManager()或getFragmentManager(),具体取决于您的API:

 FragmentManager fm = getSupportFragmentManager(); fm.addOnBackStackChangedListener(new OnBackStackChangedListener() { @Override public void onBackStackChanged() { if(getSupportFragmentManager().getBackStackEntryCount() == 0) finish(); } }); 

最后的话:我不build议你使用这个解决scheme,因为如果你从片段1到片段2,反之亦然10次,当你按下10次button时,它将按照用户不想要的顺序进行。

在最近的个人项目中,我解决了这个问题,如果堆栈是空的,就不要调用addToBackStack

  // don't add the first fragment to the backstack // otherwise, pressing back on that fragment will result in a blank screen if (fragmentManager.getFragments() != null) { transaction.addToBackStack(tag); } 

这是我的全面实施:

  String tag = String.valueOf(mCurrentSectionId); FragmentManager fragmentManager = mActivity.getSupportFragmentManager(); Fragment fragment = fragmentManager.findFragmentByTag(tag); if (fragment != null) { // if the fragment exists then no need to create it, just pop back to it so // that repeatedly toggling between fragments doesn't create a giant stack fragmentManager.popBackStackImmediate(tag, 0); } else { // at this point, popping back to that fragment didn't happen // So create a new one and then show it fragment = createFragmentForSection(mCurrentSectionId); FragmentTransaction transaction = fragmentManager.beginTransaction() .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .replace(R.id.main_content, fragment, tag); // don't add the first fragment to the backstack // otherwise, pressing back on that fragment will result in a blank screen if (fragmentManager.getFragments() != null) { transaction.addToBackStack(tag); } transaction.commit(); } 

如果你想跟踪片段,你应该重写onBackPressed方法,像这样public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() == 1) { finish(); } else { super.onBackPressed(); } } public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() == 1) { finish(); } else { super.onBackPressed(); } }

我仍然无法通过getBackStackEntryCount()解决问题,我解决了我的问题,使主页面也是一个片段,所以最后我只有一个FrameLayout的活动; 和所有其他片段,包括主页我膨胀到该布局。 这解决了我的问题。