2017-03-11 1 views
0

Je développe une application qui implique des fragments. Il y a trois fragmentsTrouver une bonne façon de supprimer la recherche sur le fragment backback

  • Liste des objets fragment
  • Détails de l'article fragmentent
  • Recherche/fragment Chargement

Tout fonctionne bien jusqu'à ce que la presse utilisateur onbackbutton. Je voudrais montrer à l'utilisateur le fragment précédent avant que le fragment de recherche ne soit affiché. J'ai essayé quelques solutions, mais aucune d'entre elles ne semble fonctionner pour moi. J'ai essayé de retirer le fragment de recherche manuellement de retour coincé mais j'ai eu la situation bizarre que le fragment précédent et le fragment actuel ont été montrés en même temps.

C'est la fonction qui remplace les fragments de l'activité principale

public void replaceFragment(Class<?> fragClass, Bundle b) 
{ 
    Fragment bf = null; 
    try 
    { 
     bf = (Fragment) fragClass.newInstance(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    if (b != null) 
    { 
     bf.setArguments(b); 
    } 

    Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container); 
    String backStateName = bf.getClass().getSimpleName(); 
    if (f != null && backStateName.equals(f.getClass().getSimpleName())) 
    { 
     return; 
    } 

    FragmentManager manager = getSupportFragmentManager(); 
    _currentFragment = bf; 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_left, R.anim.exit_to_right); 

    if(backStateName.equals(LoadingFragment.class.getSimpleName())) 
    { 
     ft.replace(R.id.fragment_container, bf).addToBackStack(null).commit(); 
    } 
    else 
    { 
     ft.replace(R.id.fragment_container, bf).addToBackStack(backStateName).commit(); 
    } 
} 

fonction onbackpress

@Override 
public void onBackPressed() 
{ 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) 
    { 
     drawer.closeDrawer(GravityCompat.START); 
    } 
    else 
    { 
     super.onBackPressed(); 
    } 
} 
+0

Au lieu de cela, maintenir tout votre fragment dans la pile et la méthode utiliser add() au lieu de remplacer() de Fragment Transaction ajouter fragment.It vous donnera un contrôle total sur le cycle de vie de navigation. –

Répondre

0

Après de nombreuses heures de ceci comprendre. Je suis tombé sur une solution simple, fondamentalement chaque fois que je charge un nouveau fragment je vérifie si le fragment actuel est le fragment de recherche si je le supprime manuellement en utilisant popBackStackImmediate(). Pas la solution la plus élégante mais cela a fonctionné pour moi.

Ceci est ma nouvelle fonction.

public void replaceFragment(Class<?> fragClass, Bundle b) 
{ 
    BaseFragment bf = null; 
    try 
    { 
     bf = (BaseFragment) fragClass.newInstance(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    if (b != null) 
    { 
     bf.setArguments(b); 
    } 

    Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container); 
    String backStateName = bf.getClass().getSimpleName(); 
    if (f != null && backStateName.equals(f.getClass().getSimpleName())) 
    { 
     return; 
    } 

    FragmentManager manager = getSupportFragmentManager(); 
    _currentFragment = bf; 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

    if (f != null && f.getClass().getSimpleName().equals(LoadingFragment.class.getSimpleName())) 
    { 
     manager.popBackStackImmediate(); 
    } 

    ft.replace(R.id.fragment_container, bf, backStateName); 
    ft.addToBackStack(backStateName); 
    ft.commitAllowingStateLoss(); 

}