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?
MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)
??. você precisa adicionar o fragmento para apoiar e estalar o mesmo de acordoRespostas:
Do Fragmento A, para ir para B, substitua A por B e use
addToBackstack()
antescommit()
.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.fonte
Eu mudo o código de
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
para
getActivity().getFragmentManager().popBackStack();
E pode fechar o fragmento.
fonte
Para quem precisa descobrir uma maneira simples
Experimentar
getActivity().onBackPressed();
fonte
popBackStack()
epopBackStackImmediate()
são formas mais diretas de estourar o fragmento superior sem simular o pressionamento de um botão. UsandoonBackPressed()
gatilhosOnBackPressedCallback
s; se no futuro você quiser controlar o pressionamento do botão Voltar especificamente, você terá que alternar parapopBackStack()
/popBackStackImmediate()
para evitar o acionamento de retornos de chamada programaticamente.getActivity().onBackPressed
faz tudo que você precisa. Ele chama automaticamente o método onBackPressed na atividade pai.fonte
Esta é uma maneira Kotlin de fazer isso. Eu criei um botão no layout de fragmento e, em seguida, configurei onClickListner em onViewCreated.
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) btn_FragSP_back.setOnClickListener { activity?.onBackPressed() } }
fonte
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.
fonte
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(); }
fonte
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(); }
fonte
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(); } });
fonte
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; } } });
fonte
Em seus fragmentos,
onCreateView(...)
você pode remover uma visualização chamandocontainer.removeView(view);
. Então, se você quiser remover o fragmento, entãoview
deve ser o valor de retorno deonCreateView
,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; }
fonte
se você precisar em 2020
Objects.requireNonNull(getActivity()).onBackPressed();
fonte
Tente este
getActivity().finish();
fonte