0

De mon activité principale, en appuyant sur le bouton Paramètres ouvre un AppCompatActivity avec FrameLayout comme le conteneur pour les fragments. Dans la méthode OnCreate, j'ajoute le fragment qui est un conteneur PreferenceScreen. En appuyant à nouveau sur un autre bouton appelé Options, ouvre le fragment fragmenté avec le fragment Options en ajoutant la classe actuelle au backstack.Deux fragments se chevauchent en raison de addBackStack

@Override 
public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref) { 

    FragmentManager manager = getSupportFragmentManager(); 

    SettingsSubscreenFragment fragment = null; 
    Bundle args = new Bundle(); 

    switch (pref.getKey()) { 
     case "pref_key_rejection_options": 
      getSupportActionBar().setTitle("Rejection Options"); 
      fragment = SettingsSubscreenFragment.newInstance("Options"); 

      break; 
    } 

    args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, pref.getKey()); 

    if (fragment != null) { 
     fragment.setArguments(args); 
    } 

    FragmentTransaction ft = manager.beginTransaction(); 
    ft.replace(R.id.fragment_container, fragment, pref.getKey()); 
    ft.addToBackStack(null); 
    ft.commit(); 

    return true; 
} 

Lorsque j'appuie sur le bouton, je suis simplement remplacer le fragment d'options au premier fragment, Paramètres, qui ne sort pas la pile arrière.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      getSupportActionBar().setTitle("Settings"); 

      FragmentManager fragmentManager; 
      FragmentTransaction ft; 
      Fragment fragment = null; 

      if (getSupportFragmentManager().findFragmentByTag("pref_key_options") != null) { 
       fragmentManager = getSupportFragmentManager(); 
       ft = fragmentManager.beginTransaction();     

       fragment = SettingsFragment.newInstance(null); 


       ft.replace(R.id.fragment_container, fragment); 
       ft.commit(); 
       fragmentManager.getFragments().clear(); 


       return true; 
      } else { 
       return super.onOptionsItemSelected(item); 
      } 

    } 
    return super.onOptionsItemSelected(item); 
} 

Ainsi, l'ouverture du fragment nouveau sur Options ajoutera une autre pile à dos et onBackPress, il apparaît que la plus haute et laisse son ombre se chevauchant l'autre enregistrée dans la pile arrière.

@Override 
public void onBackPressed() { 
    int backStackCount = getSupportFragmentManager().getBackStackEntryCount(); 

    if (backStackCount >= 1) { 
     getSupportActionBar().setTitle("Settings"); 
     getSupportFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

La presque la même situation est comme de here, troisième image de la question, mais je ne peux pas le faire fonctionner avec leurs suggestions. Qu'est-ce que je fais de mal et que puis-je faire pour que cela fonctionne? Merci beaucoup.

Répondre

0

Vérifiez FragmentTransaction, SettingsSubscreenFragment et SettingsFragment étendent android.support.v4.app.Fragment. Si ce n'est pas le cas, essayez

class YourFragments extends android.support.v4.app.Fragment 

dans vos classes de fragment.

+0

J'utilise 'PreferenceFragmentCompat' pour ces fragments et' AppCompatActivity' pour l'activité contenant le conteneur pour ces fragments. Pour la 'FragmentTransaction', j'utilise aussi la bibliothèque de support. –