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


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.