Je travaille sur un projet et je dois pouvoir utiliser le bouton de retour dans chaque fragment pour naviguer entre les fragments précédents, j'ai des méthodes écrites pour le faire en utilisant une flèche de retour dans la barre d'action, cependant, je veux pouvoir pour utiliser la même fonctionnalité sur le bouton de retour enfoncé. Je ne veux pas utiliser la pile arrière. Y a-t-il un moyen de faire cela?
MODIFIER
Plutôt que d'utiliser la pile arrière, je veux pouvoir appeler la méthode de retour à la méthode précédente ci-dessous lorsque l'utilisateur clique sur le bouton Retour. J'ai besoin d'utiliser la méthode gobackpressed dans des fragments. Est-ce possible? J'espère que c'est clair et concis. Toutes mes excuses pour toute confusion causée ci-dessus.
Revenir au précédent
public void gobackToPreviousFragment(String preFragmentTag, Fragment preFragment){
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.animator.close_slide_in,R.animator.close_slide_out);
ft.show(preFragment);
//**BY REMOVING FRAGMENT, WHEN USER TRIES TO REVISIT, FRAGMENT IS BLACK**
ft.remove(fm.findFragmentByTag(Misc.currentContentFragmentTag));
ft.addToBackStack(null);
ft.commit();
Misc.currentContentFragmentTag = preFragmentTag;
createBar(preFragment);
}
Aller de l'avant
public void gotoNextFragment(String nextTag, Fragment nextFragment){
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.animator.enter_slide_in, R.animator.enter_slide_out);
boolean newlyCreated = false;
if(nextFragment == null){
nextFragment = Fragment.instantiate(this, nextTag);
newlyCreated = true;
}
//hide current fragment
ft.hide(fm.findFragmentByTag(Misc.currentContentFragmentTag));
if(newlyCreated){
ft.add(R.id.content_frame, nextFragment, nextTag);
}
else{
ft.show(nextFragment);
}
ft.addToBackStack(null);
ft.commit();
Misc.currentContentFragmentTag = nextTag;
createBar(nextFragment);
}
Voici comment je navigue d'avant en arrière, et j'aimerais pouvoir implémenter la méthode de retour en arrière sur onBackPressed (). Est-ce que ça a du sens?
Pourquoi ne voulez-vous pas utiliser la pile arrière? S'il y a un problème sous-jacent ou une confusion, nous pouvons peut-être vous éclaircir.
Si vous voulez respecter votre exigence, remplacez simplement la méthode onBackPressed () de votre activité et appelez la méthode que vous appelez lorsque la flèche de retour de votre ActionBar est cliquée.
EDIT: Comment résoudre le problème de pile de fragments de "l'écran noir":
Vous pouvez contourner ce problème en ajoutant un écouteur backstack au gestionnaire de fragments. Cet écouteur vérifie si la pile arrière de fragments est vide et termine l'activité en conséquence:
Vous pouvez définir cet écouteur dans la méthode onCreate de votre activité:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getFragmentManager();
fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if(getFragmentManager().getBackStackEntryCount() == 0) finish();
}
});
}
Je n'ai pas trouvé de bonne réponse à ce problème, c'est donc ma solution.
Si vous souhaitez revenir Appuyez sur dans chaque fragment, procédez comme suit.
créer l'interface OnBackPressedListener
public interface OnBackPressedListener {
void onBackPressed();
}
Que chaque fragment qui veut être informé de backPress
implémente cette interface.
Dans l'activité parent, vous pouvez remplacer onBackPressed()
@Override
public void onBackPressed() {
List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
if (fragmentList != null) {
//TODO: Perform your logic to pass back press here
for(Fragment fragment : fragmentList){
if(fragment instanceof OnBackPressedListener){
((OnBackPressedListener)fragment).onBackPressed();
}
}
}
}
Dans le fragment où vous souhaitez gérer votre bouton arrière, vous devez attacher des éléments à votre vue dans la vue oncreate
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.second_fragment, container, false);
v.setOnKeyListener(pressed);
return v;
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if( keyCode == KeyEvent.KEYCODE_BACK ){
// back to previous fragment by tag
myfragmentclass fragment = (myfragmentclass) getActivity().getSupportFragmentManager().findFragmentByTag(TAG);
if(fragment != null){
(getActivity().getSupportFragmentManager().beginTransaction()).replace(R.id.cf_g1_mainframe_fm, fragment).commit();
}
return true;
}
return false;
}
};
Vous pouvez essayer de remplacer onCreateAnimation
, paramètre et catch enter==false
. Cela se déclenchera avant chaque contre-pression.
@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
if(!enter){
//leaving fragment
Log.d(TAG,"leaving fragment");
}
return super.onCreateAnimation(transit, enter, nextAnim);
}
Pour un fragment, vous pouvez simplement ajouter
getActivity().onBackPressed();
à votre code