2017-10-15 5 views
-2

J'ai un MainActivity et d'autres Fragments qui ouvrent un WebView lorsque l'utilisateur clique sur eux sur NavigationViewer. J'ai ajouté Accueil Fragment à la navigation, mais je ne sais pas comment le rendre par défaut de sorte que si l'utilisateur ouvre l'App, la maison par défaut Fragment s'ouvre. Dois-je créer une autre classe Java ou utiliser MainActivity. Java comme à la maison? Si oui, comment utiliser MainActivity. Java comme à la maison Fragment? Et si l'utilisateur clique sur d'autres Fragment pour ouvrir un WebView et appuie sur le bouton de retour, comment faire revenir à la maison par défaut Fragment? En ce moment, si j'appuie sur le bouton de retour, il détruit littéralement App et revient à l'arrière-plan du téléphone.Comment rendre la mainactivité comme fragment d'origine?

Répondre

0

Si vous avez une activité Launcher qui a un fournisseur de fragment pour définir le contenu, vous pouvez stocker le fragment par défaut d'une manière ou d'une autre.

Généralement, vous commencez votre activité et vous avez un FragmentManager qui remplace une partie de votre contenu par un fragment.

Si vous voulez avoir un comportement changeant en fonction d'une logique, vous voulez stocker le fragment de départ avec Ids ou similaire en utilisant SharedPreferences ou toute autre technologie de stockage comme SQLite.

0

Je suppose que vous changez entre les fragments dans onNavigationItemSelected en utilisant un FragmentManager semblable à ceci:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.content_frame, new HomeFragment); 
ft.commit(); 

Si vous voulez ouvrir Fragment lorsque l'activité commence, ce que vous devez est exactement le même que ce que vous faites en onNavigationItemSelected, vous devez appeler FragmentManager sur onCreate et aussi faire le point sur le NavigationView sélectionné:

navigationView.setCheckedItem(R.id.home_fragment); 

Quant à dos b utton, vous devez remplacer la fonction onBackPressed.Si vous utilisez la navigation modèle Tiroir à partir d'Android studio, il devrait être:

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

Vous pouvez simplement ajouter votre logique dans la partie else, vous pouvez garder une trace du fragment actif en gardant une référence à elle/à la recherche de FragmentManager (ou à la recherche de l'élément sélectionné panneau de navigation) et qu'il se comporte en conséquence:

Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.content_frame) 
if(currentFragment instanceof HomeFragment) 
    super.onBackPressed(); 
else { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.content_frame, new HomeFragment); 
    ft.commit(); 
} 
0

le premier jeu une sorte de « conteneur » dans votre MainActivityLayout qui contiendra le Fragment:

<FrameLayout 
      android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_above="@+id/indications_LL" 
      > 
</FrameLayout> 

Définissez ensuite les FragmentManager et FragmentTransaction:

private FragmentManager fragmentManager = getFragmentManager(); 
private FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

si vous voulez commencer par la Fragment principale dans votre méthode onCreate() ajoutez le code ci-dessous:

fragmentTransaction.add(R.id.container, new MainFragment(), *"set Tag for your fragment"*); 

N'oubliez pas ajoutez le Fragment au BackStack:

ragmentTransaction.addToBackStack(*"Your Fragment Tag"*) 

Jetez un oeil à mon code exemple ci-dessous:

/** 
* A fragment transaction Method 
* 
* @param fragment the fragment we want to display 
*/ 
private void setFragmentTransaction(Fragment fragment, MainMenus tagName) { 


    fragmentManager = getFragmentManager(); 
    fragmentTransaction = fragmentManager.beginTransaction(); 

    //replacing fragments new Fragments 
    if (fragment != null) { 
     fragmentTransaction.replace(R.id.container, fragment, tagName.toString()); 
    } else if (fragment == null && (fragmentManager.getBackStackEntryCount() == 0)) { // starting with main Fragment 
     fragmentTransaction.add(R.id.container, new MainFragment(), MainMenus.MAIN_MENUS.toString()); 
    } 
    if (tagName == null) { 
     fragmentTransaction.addToBackStack(null); 
    } else { 
     fragmentTransaction.addToBackStack(tagName.toString()); 
    } 
    fragmentTransaction.commitAllowingStateLoss(); 
    fragmentManager.executePendingTransactions(); 
} 

Pour le backbutton vous devez @Override la méthode onBackPressed(). Ensuite, vous pouvez gérer le backPress en utilisant le Fragment's TAG ou vous pouvez popBackStack() quand il atteindre au nombre de spécifique Fragment: Jetez un oeil à l'exemple ci-dessous:

 @Override 
     public void onBackPressed() { 

    //The first method, using TAG 
      if (fragmentManager.findFragmentByTag(* "Your Fragment TAG" *.toString()) !=null){ 
       fragmentManager.popBackStack() 
      } 


    //The second method: if more than two fragment, delete fragment stack 
      if (fragmentManager.getBackStackEntryCount() > 3) { 
       fragmentManager.popBackStack(); 
      } 
super.onBackPressed(); 
     }