Як закрити поточний фрагмент за допомогою кнопки, як кнопки "Назад"?


85

Я намагаюся закрити поточний фрагмент за допомогою кнопки Image.

Я перебуваю у фрагменті-А, і він перейде до фрагмента-Б, коли я натисну кнопку.

І коли я натискаю кнопку на Fragment-B, вона переходить до Fragment-C і закриває Fragment-B.

Якщо я натисну кнопку Назад у Fragment-C, вона повернеться до Fragment-A.

Код, який я маю спробувати, такий, як наведений нижче

camera_album = (ImageButton) view.findViewById(R.id.camera_album);

camera_album.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {

                    closefragment();
        Fragment fragment = FileBrowserFragment.newInstance(null, null, null) ;
        MainActivity.addFragment(LocalFileBrowserFragment.this, fragment) ;


    }
});

private void closefragment() {
    getActivity().getFragmentManager().beginTransaction().remove(this).commit();
}

Коли я натискаю кнопку "Назад" у фрагменті-B, воно переходить до фрагмента-C.

Але коли я натискаю кнопку назад на Fragment-C, вона не повертається до Fragment-A. Він повертається на порожній фон. Якщо я хочу повернутися до фрагмента-А, мені потрібно ще раз натиснути кнопку назад.

ТАК, здається, не завершує поточний фрагмент.

Як закінчити поточний фрагмент, як кнопку "Назад" Android?


Що це таке MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)??. вам потрібно додати фрагмент до бекстейка і відповідно додати те саме
— Рагхундан

Додано фрагмент у функцію addFragment.
— Вун

додати фрагмент до чого та метод діяльності ??
— Рагхундан

2
getActivity (). onBackPress (); може це зробити
— Вісванатх Лекшман

Відповіді:


82

Від фрагмента A перейдіть до B, замініть A на B і використовуйте addToBackstack()раніше commit().

Тепер з фрагмента B, щоб перейти до C, спочатку використовуйте popBackStackImmediate(), це поверне A. Тепер замініть A на C, як і перша транзакція.


4
для usinf popStackImmediate (): -> getView (). setOnKeyListener (новий View.OnKeyListener () {@Override public boolean onKey (View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {getEvent. .getSupportFragmentManager (). popBackStackImmediate (); return true;} return false;}});
— Yash Agrawal

131

Я міняю код з getActivity().getFragmentManager().beginTransaction().remove(this).commit();

до

getActivity().getFragmentManager().popBackStack();

І це може закрити фрагмент.


35
getActivity (). onBackPress (); Тобто це зробить те, що ви пояснили.
— Вісванатх Лекшман

4
@ suomi35 ні. Коли вам потрібно перевизначити onBackPress (), ви зіткнетеся з проблемами з такою реалізацією
— Le_Enot

Здається, не працює. у 2016 році setNavigationOnClickListener не працює.

1
@ViswanathLekshmanan Я думаю, це має бути відповідь замість коментаря. І прийнята відповідь, крім того.
— Франсіско Ромеро,

1
Це також закриває Діяльність! Потрібно лише закриття фрагмента.
— Zon

70

Для тих, кому потрібно розібратися простим способом

Спробуйте getActivity().onBackPressed();


getActivity () може бути нульовим багато разів.
— Arpit J.

1
@ArpitJ. це лише нуль до виклику onAttach (), фрагмент не може жити без активності.
— Тамім Аттафі

@TamimAttafi Правда, але я мав на увазі такі випадки, як обертання або активність закінчена, і з якоїсь причини екземпляр фрагмента все ще там, то він поверне нуль.
— Arpit J.

popBackStack()і popBackStackImmediate()є більш прямими способами вискакування самого верхнього фрагмента без імітації натискання кнопки. Використання onBackPressed()тригерів OnBackPressedCallbacks; якщо в майбутньому ви хочете спеціально обробляти натискання кнопок "Назад", вам доведеться переключитися на popBackStack()/, popBackStackImmediate()щоб уникнути програмних зворотних викликів.
— Нолан Емі

Ви поміщаєте цей код у метод onclick кнопок Фрагменту.
— Анон,

6

getActivity().onBackPressedробить все, що вам потрібно. Він автоматично викликає метод onBackPress у батьківській діяльності.


4

Спробуйте це:

ft.addToBackStack(null);   // ft is FragmentTransaction

Отже, під час натискання клавіші " назад" поточна дія (яка містить кілька фрагментів) завантажує попередній фрагмент, а не завершує його.


4

Спробуйте це:

public void removeFragment(Fragment fragment){
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.remove(fragment);
    fragmentTransaction.commit();
}

4

Ви можете спробувати цю логіку, тому що вона працює для мене.

frag_profile profile_fragment = new frag_profile();

boolean flag = false;
@SuppressLint("ResourceType")
public void profile_Frag(){
    if (flag == false) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.setCustomAnimations(R.anim.transition_anim0, R.anim.transition_anim1);
        transaction.replace(R.id.parentPanel, profile_fragment, "FirstFragment");
        transaction.commit();
        flag = true;
    }

}

@Override
public void onBackPressed() {
    if (flag == true) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.remove(profile_fragment);
        transaction.commit();
        flag = false;
    }
    else super.onBackPressed();
}

4

Це спосіб Kotlin для цього, я створив кнопку у макеті фрагментів, а потім встановив onClickListner у onViewCreated.

згідно з коментарем @ Viswanath-Lekshmanan

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) 
{
     super.onViewCreated(view, savedInstanceState)

     btn_FragSP_back.setOnClickListener {
        activity?.onBackPressed()
    }
}

це закриває діяльність, а не фрагмент
— nibbana

3
Button ok= view.findViewById(R.id.btSettingOK);
Fragment me=this;
ok.setOnClickListener( new View.OnClickListener(){
    public void onClick(View v){
     getActivity().getFragmentManager().beginTransaction().remove(me).commit();
    }
});

3
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
— rollstuhlfahrer

Цей простий код фактично видаляє поточний вигляд фрагментів кнопкою ОК або Закрити на ньому. Я використовую його для виходу з панелі налаштування світла, що відображається як Фрагмент, і повертаюся до Діяльності. Вибачте за цей трюк, але під Android 8 я думаю, що не так практично управляти кількома фрагментами.
— Бруно Л.

1

Якщо вам потрібно обробити дію більш конкретно за допомогою кнопки "Назад", ви можете скористатися таким методом:

view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            onCloseFragment();
            return true;
        } else {
            return false;
        }
    }
});

0

У своїх фрагментах onCreateView(...)ви можете видалити подання, зателефонувавши container.removeView(view);. Отже, якщо ви хочете видалити фрагмент, тоді viewмає бути повернене значення onCreateView,

наприклад

    public View onCreateView(...){
        final View view = inflater.inflate(R.layout.your_fragments_layout,container,false);
        //Do something
        finishButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                container.removeView(view);
            }
        });
        return view;
    }

-7

Спробуйте цей

getActivity().finish();

1
Спробуйте пояснити свою відповідь більше, щоб ОП та інші люди могли легко зрозуміти відповідь, яка повернеться до цього питання в майбутньому
— Аман Чхабра

7
це закриває всю діяльність, а не фрагмент
— busuu

Мені це допомогло. Ті, хто хоче отримати більше інформації, можуть погуглити її. Не потрібно копіювати тут офіційну документацію.
— Alesha170

Якщо ви використовуєте BottomNavigationView, який зазвичай має одну активність, ця команда закриє програму, а не повернеться до попереднього фрагмента.
— Алітон Олівейра
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.