OnBackPressed () android с фрагментами

Добрый вечер. Мое приложение запускается с экрана-заставки, для этого я использую 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 скриншота, чтобы понять мою проблему. Пытаюсь решить несколько часов самостоятельно.

введите описание изображения здесь

введите описание изображения здесь

когда вы нажимаете кнопку «Назад», предыдущая активность отображается черной кнопкой, поэтому вы хотите, чтобы при нажатии кнопки «Назад» приложение закрывалось?

Ashish 04.01.2019 18:51

да. Я полагаю, он помнит активность. Поскольку у меня около 8 фрагментов в NavigationView, и когда я нажимаю на них и после этого нажимаю кнопку «Назад», они появляются в правильном порядке fragmentTransaction.addToBackStack (null);

FuryMaxim 04.01.2019 18:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, что вы добавляете исходный HomeFragment в задний стек. Это означает, что транзакция от «без фрагмента» до «Home» может быть отменена. Когда вы нажимаете кнопку «Назад», вы выталкиваете эту транзакцию из стека, в результате чего Fragment не отображается.

Просто удалите fragmentTransaction.addToBackStack(null); из вашего метода showHome().

Спасибо, сэр! Оно работает. Приму ваш ответ через несколько минут (задержка 7 минут)

FuryMaxim 04.01.2019 18:56

Другие вопросы по теме