在按下后退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
的活动; 和所有其他片段,包括主页我膨胀到该布局。 这解决了我的问题。