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
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.
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();
}
le premier jeu une sorte de « conteneur » dans votre MainActivity
Layout
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();
}