Ich habe versucht, das aktuelle Fragment mit Imagebutton zu schließen.
Ich bin in Fragment-A und es wird sich das Fragment-B anzeigen, wenn ich auf die Schaltfläche klicke.
Wenn ich bei Fragment-B auf die Schaltfläche klicke, wird das Fragment-C angezeigt und das Fragment-B geschlossen.
Wenn ich bei Fragment-C auf die Schaltfläche "Zurück" klicke, wird wieder das Fragment-A angezeigt.
Der Code, den ich probiert habe, ist wie folgt
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();
}
Wenn ich bei Fragment-B auf die Schaltfläche "Zurück" klicke, wird das Fragment-C angezeigt.
Wenn ich jedoch auf die Schaltfläche "Zurück" in Fragment-C klicke, kehrt das Fragment-A nicht zurück, sondern in den leeren Hintergrund. Wenn ich zu Fragment-A zurückkehren möchte, muss ich erneut auf die Schaltfläche "Zurück" klicken.
SO scheint das aktuelle Fragment nicht abgeschlossen zu sein.
Wie beende ich das aktuelle Fragment wie die Zurück-Taste von Android?
Um von Fragment A zu B zu gelangen, ersetzen Sie A durch B und verwenden Sie addToBackstack()
vor commit()
.
Um nun von Fragment B zu C zu gelangen, verwenden Sie zuerst popBackStackImmediate()
. Dies bringt A zurück. Ersetzen Sie nun A durch C, genau wie bei der ersten Transaktion.
Ich ändere den Code von getActivity().getFragmentManager().beginTransaction().remove(this).commit();
zu
getActivity().getFragmentManager().popBackStack();
Und es kann das Fragment schließen.
Für diejenigen, die einen einfachen Weg finden müssen
getActivity().onBackPressed();
ausprobieren
Versuche dies:
ft.addToBackStack(null); // ft is FragmentTransaction
Wenn Sie also back-key drücken, lädt die aktuelle Aktivität (die mehrere Fragmente enthält) das vorherige Fragment und nicht das Ende.
Dies ist eine Kotlin-Methode. Ich habe eine Schaltfläche im Fragment-Layout erstellt und dann onClickListner in onViewCreated gesetzt.
laut @ Viswanath-Lekshmanan Kommentar
override fun onViewCreated(view: View?, savedInstanceState: Bundle?)
{
super.onViewCreated(view, savedInstanceState)
btn_FragSP_back.setOnClickListener {
activity.onBackPressed()
}
}
Sie können diese Logik ausprobieren, weil sie für mich funktioniert.
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();
}
Versuche dies:
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();
}
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();
}
});
getActivity().onBackPressed
erledigt alles was Sie brauchen. In der übergeordneten Aktivität wird automatisch die Methode onBackPressed aufgerufen.
Wenn Sie die Aktion spezifischer mit der Zurück-Schaltfläche ausführen müssen, können Sie die folgende Methode verwenden:
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;
}
}
});
Probier diese
getActivity().finish();