Добрый вечер. Мое приложение запускается с экрана-заставки, для этого я использую android:noHistory = "true" (я также использую noHistory для MainActivity). Моя MainActivity - это метод android.support.design.widget.NavigationView. Inside onCreate(). Я использую showMethod() для рисования домашнего фрагмента (домашней страницы).
Итак, когда я нажимаю кнопку «Назад», все работает нормально, приложение запоминает все открытые фрагменты в правильном порядке. Но!, когда я нажимаю кнопку «Назад» на своей домашней странице (которая была открыта после запуска приложения), он показывает мне пустой экран с предыдущим заголовком действия.
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
showHome();
}
Fragment fragment = null;
private void showHome(){
fragment = new Home();
if (fragment != null){
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_main , fragment,fragment.getTag());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
@Override
public void onBackPressed() {
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0) {
super.onBackPressed();
} else {
getFragmentManager().popBackStack();
}
}
private void displaySelectedScreen(int id){
switch (id){
case R.id.nav_cafe_restaurants:
fragment = new Cafe_restaurants();
break;
case R.id.nav_cinemas:
fragment = new Cinemas();
break;
case R.id.nav_enjoys:
fragment = new Enjoys();
break;
case R.id.nav_night_clubs:
fragment = new Night_clubs();
break;
case R.id.nav_theaters:
fragment = new Theaters();
break;
case R.id.nav_museums:
fragment = new Museums();
break;
case R.id.nav_sports:
fragment = new Sports();
break;
case R.id.nav_sights:
fragment = new Sights();
break;
case R.id.nav_current_actions:
fragment = new Current_events();
break;
case R.id.nav_future_actions:
fragment = new Future_events();
break;
case R.id.nav_contacts:
fragment = new Contacts();
break;
}
if (fragment != null){
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_main , fragment,fragment.getTag());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
}
Вы можете посмотреть 2 скриншота, чтобы понять мою проблему. Пытаюсь решить несколько часов самостоятельно.
да. Я полагаю, он помнит активность. Поскольку у меня около 8 фрагментов в NavigationView, и когда я нажимаю на них и после этого нажимаю кнопку «Назад», они появляются в правильном порядке fragmentTransaction.addToBackStack (null);




Ваша проблема в том, что вы добавляете исходный HomeFragment в задний стек. Это означает, что транзакция от «без фрагмента» до «Home» может быть отменена. Когда вы нажимаете кнопку «Назад», вы выталкиваете эту транзакцию из стека, в результате чего Fragment не отображается.
Просто удалите fragmentTransaction.addToBackStack(null); из вашего метода showHome().
Спасибо, сэр! Оно работает. Приму ваш ответ через несколько минут (задержка 7 минут)
когда вы нажимаете кнопку «Назад», предыдущая активность отображается черной кнопкой, поэтому вы хотите, чтобы при нажатии кнопки «Назад» приложение закрывалось?