English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Android-Code de mise en œuvre de la fonction de basculement de page Fragment

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

Vous pourriez aussi aimer