В Fragment на задней кнопке нажата Операция пуста
У меня есть Activity и много фрагментов, надутых в одном и том же FrameLayout
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
example: 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);
, но я не могу вернуться через фрагменты, так как я перехожу непосредственно на главную страницу.
Ответы
Ответ 1
Если вы используете более одного фрагмента в активности или даже если у вас есть только один фрагмент, тогда первый фрагмент не должен содержать addToBackStack. Поскольку это позволяет вернуться назад, и до этого фрагмента будет отображаться пустой макет действия.
// fragmentmaganer.addToBackStack() // dont include this for your first fragment.
Но для другого фрагмента вам нужно определить это иначе, но обратно не будет перемещаться по более раннему экрану (фрагменту), а приложение может завершить работу.
Ответ 2
@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();
Ответ 3
Извините за поздний ответ.
Вам не нужно добавлять 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
Ответ 4
Вы можете переопределить onBackPressed
и проверить, есть ли что-либо на задней панели.
@Override
public void onBackPressed() {
int fragments = getFragmentManager().getBackStackEntryCount();
if (fragments == 1) {
// make layout invisible since last fragment will be removed
}
super.onBackPressed();
}
Ответ 5
Если вы хотите отслеживать фрагменты, вы должны переопределить метод onBackPressed
, например
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 1) {
finish();
} else {
super.onBackPressed();
}
}
Ответ 6
Решение 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 раз, она сделает это в обратном порядке, который не будет хочу этого.
Ответ 7
В недавнем личном проекте я решил это, не вызывая 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();
}
Ответ 8
Я все еще не мог исправить проблему с помощью getBackStackEntryCount()
, и я решил проблему, сделав на главной странице также фрагмент, поэтому в итоге у меня есть активность только с FrameLayout
; и все остальные фрагменты, включая главную страницу i, раздуваются в этот макет. Это решило мою проблему.