我有一个活动和许多碎片在同一个膨胀 FrameLayout
示例:mainActivity>任何片段(按后退按钮)>活动为空.
在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);
我想我需要GONE
在后退时再次使frameLayout的可见性,但我该怎么做?
我尝试onBackPressed
并设置layout.setVisibility(View.GONE);
但我无法通过片段返回,因为我直接进入主页.
如果您在活动中使用了多个片段,或者即使您只有一个片段,那么第一个片段也不应该定义addToBackStack.由于这允许返回导航,因此在此片段之前将显示空活动布局.
// fragmentTransaction.addToBackStack() // dont include this for your first fragment.
但是对于另一个片段,你需要定义它,否则后面将不会导航到早期的屏幕(片段),而是应用程序可能会关闭.
@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
方法,就像这样
public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() == 1) { finish(); } else { super.onBackPressed(); } }
您可以覆盖onBackPressed
并检查后台堆栈上是否有任何内容.
@Override public void onBackPressed() { int fragments = getFragmentManager().getBackStackEntryCount(); if (fragments == 1) { // make layout invisible since last fragment will be removed } super.onBackPressed(); }
回复晚了非常抱歉.
你不必添加 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