Como fechar o fragmento atual usando o botão como o botão Voltar?

89

Tentei fechar o fragmento atual usando Imagebutton.

Estou no Fragment-A e ele mudará para o Fragment-B quando eu clicar no botão.

E quando eu clico no botão no Fragment-B, ele se transforma em Fragment-C e fecha o Fragment-B.

Se eu clicar no botão Voltar no Fragment-C, ele voltará para o Fragment-A.

O código que tentei é como o seguinte

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

Quando clico no botão Voltar no fragmento-B, ele muda para o Fragmento-C.

Mas quando clico no botão Voltar no Fragment-C, ele não volta para o Fragment-A. De volta ao fundo vazio. Se eu quiser voltar ao Fragmento-A, preciso clicar no botão Voltar mais uma vez.

ASSIM, parece que não fecha o fragmento atual completo.

Como terminar o fragmento atual como o botão Voltar do Android?

Wun
fonte
O que é isso MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)??. você precisa adicionar o fragmento para apoiar e estalar o mesmo de acordo
Raghunandan
Não foi adicionado o fragmento na função addFragment.
Wun
adicionar fragmento a quê e um método de atividade ??
Raghunandan
2
getActivity (). onBackPressed (); pode fazer isso
Viswanath Lekshmanan

Respostas:

82

Do Fragmento A, para ir para B, substitua A por B e use addToBackstack()antes commit().

Agora, do Fragmento B, para ir para C, primeiro use popBackStackImmediate(), isso trará de volta A. Agora substitua A por C, assim como na primeira transação.

SD
fonte
4
para usinf popStackImmediate (): -> getView (). setOnKeyListener (new View.OnKeyListener () {@Override public boolean onKey (View v, int keyCode, evento KeyEvent) {if (keyCode == KeyEvent.KEYCODE_BACK) {getActivity () .getSupportFragmentManager (). popBackStackImmediate (); retornar verdadeiro;} retornar falso;}});
Yash Agrawal
134

Eu mudo o código de getActivity().getFragmentManager().beginTransaction().remove(this).commit();

para

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

E pode fechar o fragmento.

Wun
fonte
36
getActivity (). onBackPressed (); Thik isso fará o que você explicou.
Viswanath Lekshmanan 01 de
5
@ suomi35 no. Quando você precisar substituir onBackPressed (), você enfrentará problemas com tal realização
Le_Enot 01 de
Não parece funciona. em 2016, em setNavigationOnClickListener não funciona.
1
@ViswanathLekshmanan Acho que isso deveria ser uma resposta em vez de um comentário. E a resposta aceita, além disso.
Francisco Romero
1
Ele fecha a atividade também! Apenas o fechamento do fragmento é necessário.
Zona
72

Para quem precisa descobrir uma maneira simples

Experimentar getActivity().onBackPressed();

Viswanath Lekshmanan
fonte
getActivity () pode ser nulo muitas vezes.
Arpit J.
1
@ArpitJ. é apenas nulo antes de onAttach () ser chamado, um fragmento não pode viver sem uma atividade.
Tamim Attafi
@TamimAttafi True, mas eu estava me referindo a casos como rotação ou atividade concluída e devido a algum motivo a instância do fragmento ainda está lá, ele retornará nulo.
Arpit J.
popBackStack()e popBackStackImmediate()são formas mais diretas de estourar o fragmento superior sem simular o pressionamento de um botão. Usando onBackPressed()gatilhos OnBackPressedCallbacks; se no futuro você quiser controlar o pressionamento do botão Voltar especificamente, você terá que alternar para popBackStack()/ popBackStackImmediate()para evitar o acionamento de retornos de chamada programaticamente.
Nolan Amy
Você coloca esse código dentro do método onclick dos botões do Fragment.
Anon
6

getActivity().onBackPressedfaz tudo que você precisa. Ele chama automaticamente o método onBackPressed na atividade pai.

Farruh Habibullaev
fonte
5

Esta é uma maneira Kotlin de fazer isso. Eu criei um botão no layout de fragmento e, em seguida, configurei onClickListner em onViewCreated.

de acordo com o comentário de @ Viswanath-Lekshmanan

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

     btn_FragSP_back.setOnClickListener {
        activity?.onBackPressed()
    }
}
Abdul Rehman
fonte
isso fecha a atividade, não o fragmento
nibbana
4

Experimente isto:

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

Portanto, quando você pressiona a tecla back , a atividade atual (que contém vários fragmentos) carregará o fragmento anterior em vez de terminar sozinha.

Shailendra Madda
fonte
4

Experimente isto:

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

Você pode tentar essa lógica porque funcionou para mim.

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();
}
Rahul Rathore
fonte
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();
    }
});
Bruno L.
fonte
3
Embora este código possa responder à pergunta, fornecer contexto adicional sobre por que e / ou como este código responde à pergunta melhora seu valor a longo prazo.
rollstuhlfahrer
1
Este código simples realmente remove a visualização do fragmento atual por um botão OK ou Fechar nele. Eu o uso para sair de um painel de configuração de luz exibido como um Fragmento e voltar para a Atividade. Desculpe por este truque, mas no Android 8, acho que não é tão prático gerenciar fragmentos múltiplos.
Bruno L.
1

Se precisar lidar com a ação mais especificamente com o botão Voltar, você pode usar o seguinte método:

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;
        }
    }
});
Morteza Jalambadani
fonte
0

Em seus fragmentos, onCreateView(...)você pode remover uma visualização chamando container.removeView(view);. Então, se você quiser remover o fragmento, então viewdeve ser o valor de retorno de onCreateView,

por exemplo

    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;
    }
Ilmard
fonte
0

se você precisar em 2020

    Objects.requireNonNull(getActivity()).onBackPressed();
Croid
fonte
-8

Tente este

getActivity().finish();
Karan Chunara
fonte
1
Tente explicar melhor sua resposta, para que seja fácil para OP e outras pessoas entenderem a resposta que voltará a esta pergunta no futuro
Aman Chhabra
7
isso fecha toda a atividade, não o fragmento
busuu
Isso me ajudou. Quem quiser mais informações pode pesquisar no Google. Não há necessidade de copiar e colar aqui a documentação oficial.
Alesha170
Se você estiver usando BottomNavigationView, que geralmente tem uma atividade, este comando fechará o aplicativo em vez de voltar ao fragmento anterior.
Aliton Oliveira 29/11/1919