Закройте приложение по нижней панели навигации, используя фрагмент

Я использую нижнюю панель навигации. Когда я нажимаю на каждый элемент в нижней части навигации, фрагмент заменяется другим. когда я хочу нажать назад, я хочу выйти из приложения. Я думаю, это легко.

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

Следует использовать onBackPressed()?

Я использовал этот код, НО не работал

boolean pressBackForExit = false;
@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0){
        pressBackForExit = true;
    }
    if (pressBackForExit){
        finish();
    }
    if (getSupportFragmentManager().getBackStackEntryCount() > 0){
        getSupportFragmentManager().popBackStack();
        if (getSupportFragmentManager().getBackStackEntryCount() == 0){
            pressBackForExit = true;
        }
    }
}

Если да, скажите как?


person hosein2rd    schedule 06.02.2018    source источник
comment
Перейдите по следующей ссылке: stackoverflow.com/questions/14275627/   -  person Arya    schedule 06.02.2018
comment
Ничего страшного. но иногда, если пользователь нажимает назад, он должен вернуться к предыдущему фрагменту   -  person hosein2rd    schedule 06.02.2018


Ответы (3)


Сначала вам нужно получить фрагмент, в котором вы сейчас находитесь. Если вы хотите вернуться только от BottomFragments, поместите туда все BottomFragments, если да, то onBackPress ();

   Fragment f = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
      if (f instanceof NavBottomOneFragment ) {
            onBackPressed();
       }

Попробуйте использовать приведенный ниже код, поместите этот код в свой класс активности. Это код для двойного нажатия для выхода из приложения.

boolean doubleBackToExitPressedOnce = false;

 @Override
public void onBackPressed() {
    if (doubleBackToExitPressedOnce) {
        super.onBackPressed();
        return;
    }
    this.doubleBackToExitPressedOnce = true;
    Toast.makeText(this, "Press again to exit..", Toast.LENGTH_SHORT).show();
    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            doubleBackToExitPressedOnce=false;
        }
    }, 2000);
}
person Abhishek kumar    schedule 06.02.2018
comment
Это завершит мою деятельность. Когда пользователь нажмет назад, если фрагмент был одним из элементов на нижней панели навигации, должен завершить действие. если фрагмент не соответствует ни одному из пунктов нижней навигации, он должен вернуться к предыдущему фрагменту. понятно? - person hosein2rd; 06.02.2018
comment
@hosein, я обновил код, просто попробуйте, он сработает для вас - person Abhishek kumar; 06.02.2018
comment
Поскольку я не видел, чтобы ваш полный код заменил R.id.fragment_container) на ваш контейнер FrameLayout внутри вашего activity.xml - person Abhishek kumar; 07.02.2018
comment
То, что я делаю здесь, получит ваш фрагмент bottomMenu, когда он получит фрагменты bottomMenu, он вызовет выход. @hosein, попробуй реализовать и дай знать. - person Abhishek kumar; 07.02.2018
comment
Я использовал f (f instanceof NavBottomOneFragment) в моем onBackPressed (), это сработало. Спасибо за вашу помощь ;) - person hosein2rd; 07.02.2018
comment
Добро пожаловать, рад помочь вам @hosein - person Abhishek kumar; 07.02.2018

Это можно сделать, используя два контейнера. Один для фоновых фрагментов, т.е. для переключения вкладок. Второй для нажатия кнопки на фрагменте. Предположим, что идентификатор контейнера - это fragment_container. Теперь в вашей активности метод onBackPressed выполните следующие действия.

@Override public void onBackPressed () {

 Fragment frag = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
 if (frag != null){ getSupportFragmentManager().beginTransaction().remove(frag).commit();
return;                
}

        super.onBackPressed();
    }
person Satender Kumar    schedule 06.02.2018
comment
этот код удалит все фрагменты. Мне нужны фрагменты на нижней панели навигации. Я не хочу удалять тему. - person hosein2rd; 06.02.2018

1.Переопределить onBackPressed() метод действия

public void onBackPressed() {
    finish()
}
person leimenghao    schedule 06.02.2018
comment
Это завершит мою деятельность. Когда пользователь нажмет назад, если фрагмент был одним из элементов на нижней панели навигации, должен завершить действие. если фрагмент не соответствует ни одному из пунктов нижней навигации, он должен вернуться к предыдущему фрагменту. понятно? - person hosein2rd; 06.02.2018
comment
вы можете использовать Transition.addToBackStack(), когда вы показываете фрагмент, а не элементы в нижней части навигации. Тогда вы сможете получить то, что хотите. Подробнее см. Что означает addToBackStack с нулевым параметром? < / а> - person leimenghao; 06.02.2018
comment
И, возможно, вы можете использовать Transition.add() вместо Transition.replace(), когда показываете другой фрагмент, который не входит в элементы нижней навигации. - person leimenghao; 06.02.2018