В Фрагмент на задней кнопке нажата Действие пустое

У меня есть Activity и много фрагментов, раздутых в одном FrameLayout

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

Пример: 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); 

Полагаю, мне нужно снова сделать видимость frameLayout GONE снова нажатой, но как мне это сделать?


Я попробовал onBackPressed и установил layout.setVisibility(View.GONE); Но я не могу вернуться через фрагменты, поскольку я перехожу непосредственно на главную страницу.

Solutions Collecting From Web of "В Фрагмент на задней кнопке нажата Действие пустое"

Если в активности было использовано более одного фрагмента или даже если у вас есть только один фрагмент, тогда первый фрагмент не должен содержать addToBackStack. Так как это позволяет вернуться назад, и до этого фрагмента будет отображаться пустой макет активности.

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

Но для другого фрагмента вам нужно иметь это в противном случае, если обратное не будет перемещаться к более раннему экрану (фрагменту), а приложение может отключиться.

Извините за поздний ответ.

Вам не нужно добавлять 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(); } 

Решение irscomp работает, если вы хотите завершить работу, когда на первом фрагменте нажата кнопка «Назад». Но если вы хотите отслеживать все фрагменты и возвращаться от одного к другому в обратном порядке, вы добавляете все фрагменты в стек:

 ft.addToBackStack(null); 

И затем добавьте это в конец onCreate (), чтобы избежать пустого экрана при последнем нажатии; Вы можете использовать getSupportFragmentManager () или getFragmentManager () в зависимости от вашего API:

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

Заключительные слова: я не предлагаю вам использовать это решение, потому что если вы перейдете от фрагмента 1 к фрагменту 2 и наоборот 10 раз, когда вы нажмете кнопку 10 раз, она сделает это в обратном порядке, который пользователи не захотят этого.

В недавнем личном проекте я решил это, не вызвав 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(); } 

Я все еще не мог исправить проблему с помощью getBackStackEntryCount() и я решил свою проблему, сделав основную страницу фрагментом, поэтому в итоге у меня есть активность только с FrameLayout ; И все остальные фрагменты, включая главную страницу i, раздуваются в этот макет. Это решило мою проблему.

Если вы хотите отслеживать фрагменты, вы должны переопределить метод onBackPressed , как этот public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() == 1) { finish(); } else { super.onBackPressed(); } } public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() == 1) { finish(); } else { super.onBackPressed(); } }