Как закрыть текущий фрагмент, используя кнопку как кнопку возврата?


89

Я пытаюсь закрыть текущий фрагмент с помощью Imagebutton.

Я нахожусь во фрагменте-A, и когда я нажимаю кнопку, он превратится во фрагмент-B.

И когда я нажимаю кнопку на фрагменте-B, он превратится в фрагмент-C и закроет фрагмент-B.

Если я нажму кнопку возврата во фрагменте-C, он вернется к фрагменту-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.

Но когда я нажимаю кнопку «Назад» на фрагменте-C, он не возвращается к фрагменту-A. Он вернулся к пустому фону. Если я хочу вернуться к фрагменту-A, мне нужно еще раз нажать кнопку «Назад».

ТАК, похоже, не закрывает текущий фрагмент.

Как закончить текущий фрагмент как кнопку возврата в Android?


Что это MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)??. вам нужно добавить фрагмент в backstak и, соответственно, выскочить то же самое
Raghunandan

Добавлен фрагмент в функцию addFragment.
Вун

к чему добавить фрагмент и метод активности ??
Raghunandan

2
getActivity (). onBackPressed (); может это сделать
Вишванат Лекшманан

Ответы:


82

Из фрагмента A, чтобы перейти к B, замените A на B и используйте addToBackstack()раньше commit().

Теперь из фрагмента B, чтобы перейти к C, сначала используйте popBackStackImmediate(), это вернет A. Теперь замените A на C, как и в первой транзакции.


4
для usinf popStackImmediate (): -> getView (). setOnKeyListener (new View.OnKeyListener () {@Override публичное логическое значение onKey (View v, int keyCode, событие KeyEvent) {if (keyCode == KeyEvent.KEYCODE_BACK) {getActivity () .getSupportFragmentManager (). popBackStackImmediate (); return true;} return false;}});
Яш Агравал

134

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

к

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

И он может закрыть фрагмент.


36
getActivity (). onBackPressed (); Thik это сделает то, что вы объяснили.
Вишванат Лекшманан,

5
@ suomi35 нет. Когда вам нужно переопределить onBackPressed (), вы столкнетесь с проблемами с такой реализацией
Le_Enot 01

Не кажется работает. в 2016 году в setNavigationOnClickListener не работает.

1
@ViswanathLekshmanan Я думаю, это должен быть ответ, а не комментарий. И принятый ответ вдобавок.
Франсиско Ромеро

1
Он также закрывает Activity! Требуется только закрытие фрагмента.
Zon

72

Для тех, кому нужно разобраться простым способом

Пытаться getActivity().onBackPressed();


getActivity () может быть нулевым много раз.
Арпит Дж.

1
@ArpitJ. это только null до вызова onAttach (), фрагмент не может существовать без активности.
Тамим Аттафи

@TamimAttafi Верно, но я имел в виду такие случаи, как вращение или действие завершено, и по какой-то причине экземпляр фрагмента все еще существует, тогда он вернет null.
Arpit J.

popBackStack()и popBackStackImmediate()являются более прямыми способами извлечения самого верхнего фрагмента без имитации нажатия кнопки. Использование onBackPressed()триггеров OnBackPressedCallbacks; если в будущем вы захотите обрабатывать нажатия кнопки «Назад» специально, вам придется переключиться на popBackStack()/, popBackStackImmediate()чтобы не запускать обратные вызовы программно.
Нолан Эми

Вы помещаете этот код в метод onclick кнопки фрагмента.
Anon


5

Это способ сделать это с помощью Kotlin, я создал кнопку в макете фрагмента, а затем установил onClickListner в onViewCreated.

согласно комментарию @ Viswanath-Lekshmanan

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

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

закрывает действие, а не фрагмент
ниббана

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();
}

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 03

1
Этот простой код фактически удаляет текущее представление фрагмента с помощью кнопки OK или Close на нем. Я использую его для выхода из панели настройки освещения, отображаемой как фрагмент, и возврата в действие. Извините за этот трюк, но под 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;
    }

0

если тебе нужно в 2020 году

    Objects.requireNonNull(getActivity()).onBackPressed();

-8

Попробуй это

getActivity().finish();

1
Попробуйте объяснить свой ответ подробнее, чтобы OP и другие люди могли понять ответ, который вернется к этому вопросу в будущем
Аман Чхабра,

7
это закрывает все действие, а не фрагмент
busuu

Мне это помогло. Те, кому нужна дополнительная информация, могут погуглить. Не нужно копировать сюда официальную документацию.
Alesha170

Если вы используете BottomNavigationView, который обычно имеет одно действие, эта команда закроет приложение, а не вернется к предыдущему фрагменту.
Aliton Oliveira
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.