English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Scène : utiliser Fragment pour réaliser le basculement des pages.
Structure de la classe :
Première partie : Activity
Dans l'Activity, utiliser getSystemService() pour remplir un Fragment (FragmentA utilisé pour la gestion)
Code partie Activity :
FragmentA fragment = FragmentA.newInstant(null); getSupportFragmentManager().beginTransaction().add(R.id.f_tab_fragment,fragment).commit();
XML:
<FrameLayout android:id="@"+id/fl_container" android:layout_width="match_parent" android:layout_above="@"+id/f_tab_fragment" android:layout_height="match_parent"/> <FrameLayout android:id="@"+id/f_tab_fragment" android:layout_width="match_parent" android:layout_height="52dp" android:layout_alignParentBottom="true"/>
Deuxième partie : FragmentA
Charger un Fragment principal FragmentA, en tant que gestionnaire d'autres sous-feuilles FragmentX.
Par exemple, il y a deux sous-feuilles FragmentB et FragmentC maintenant.
FragmentA utilise FragmentManager et FragmentTransaction pour gérer le basculement de FragmentB et FragmentC
Code de FragmentA:
public class FragmentA extends BaseFragment { private static final String TAB_HOME = com.timediffproject.module.home.MyMainFragment.class.getName(); private static final String TAB_TEST = com.timediffproject.module.home.TestFragment.class.getName(); private BaseFragment mLastShowFragment; private static TabFragment fragment; public static TabFragment newInstant(Bundle bundle){ if (fragment == null){ fragment = new TabFragment(); fragment.setArguments(bundle); } return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); initTabInfo(); } private void initTabInfo(){ FragmentManager fm = getFragmentManager(); if (fm == null){ return; } FragmentTransaction ft = fm.beginTransaction(); BaseFragment home = (BaseFragment) fm.findFragmentByTag(TAB_HOME); if (home != null){ ft.hide(home); } BaseFragment test = (BaseFragment) fm.findFragmentByTag(TAB_TEST); if (test != null){ ft.hide(test); } ft.commit(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_tab, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); view.findViewById(R.id.btn_change_home).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { switchTo(TAB_HOME, null); } }); view.findViewById(R.id.btn_change_test).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { switchTo(TAB_TEST, null); } }); switchTo(TAB_HOME, null); } //Méthode de basculement de Fragment (FragmentB, FragmentC) //tab est le nom de la classe du Fragment (par exemple : FragmentB.class.getName()) //R.id.fl_container est dans le layout de l'Activity, pas dans le layout du FragmentA private void switchTo(String tab, Bundle bundle){ //Initialisation de la classe gérant les Fragments FragmentManager fm = getFragmentManager(); if (fm == null){ return; } FragmentTransaction ft = fm.beginTransaction(); //Recherche du Fragment de classe tab dans le FragmentManager BaseFragment fragment = (BaseFragment) fm.findFragmentByTag(tab); if (fragment == null){ fragment = (BaseFragment) Fragment.instantiate(getActivity(), tab); fragment.setArguments(bundle); ft.add(R.id.fl_container, fragment, tab); }else{ ft.show(fragment); } //Cacher le Fragmeng affiché en ce moment if (mLastShowFragment != null) { ft.hide(mLastShowFragment); } //Enregistrer le Fragmeng cliqué pour la dernière fois mLastShowFragment = fragment; ft.commitAllowingStateLoss(); } }
XML:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="52dp"> <Button android:id="@"+id/btn_change_home" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Changer home" /> <Button android:id="@"+id/btn_change_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Changer test" /> </LinearLayout>
Troisième : FragmentX (FragmentB, FragmentC)
La logique de la page enfant doit être définie en fonction de l'entreprise spécifique, et réalisée de la même manière qu'un Fragmeng général
Par exemple :
public class TestFragment extends BaseFragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_test, container, false);} } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } }
À ce stade, il est possible de réaliser simplement-Fonction de basculement de page par fragment Tab en bas
Image jointe :
PS : Erreurs rencontrées lors de la mise en œuvre
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Méthode correcte : L'initialisation du layout du fragment concerné doit inclure false pour établi une relation avec le layout du parent.
Raison : Si vous ne l'ajoutez pas, le système liera le view sorti par inflater à une classe parent inconnue. Lorsque vous liez ce fragment à une Activity ou à un autre fragment en tant que page enfante, vous verrez l'erreur ci-dessus.
@Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //La manière correcte est : //return inflater.inflate(R.layout.fragment_test, container, false); return inflater.inflate(R.layout.fragment_test, container); }
C'est tout le contenu de cet article, j'espère qu'il sera utile à votre apprentissage, et j'espère que vous soutiendrez également le tutoriel à cri
Déclaration : Les informations contenues dans cet article sont extraites du réseau, appartiennent aux auteurs originaux, le contenu est apporté par les utilisateurs d'Internet de manière volontaire et téléchargé, ce site n'appartient pas au site, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique. Si vous trouvez du contenu suspect de droits d'auteur, veuillez envoyer un e-mail à : notice#w3Déclaration : Le contenu de cet article est issu du réseau, et appartient aux auteurs originaux. Le contenu est fourni par les utilisateurs d'Internet de manière volontaire et est téléchargé, ce site ne détient pas de propriété, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique. Si vous trouvez du contenu suspect de droits d'auteur, veuillez envoyer un e-mail à : notice#w