1

Dans mon application Android, j'ai un ViewPager et 5 fragments. J'ai déjà utilisé viewPager.setCurrentItem() pour naviguer, mais l'exigence d'animation de navigation a changé; Pour un exemple dans certains fragments quand un fragment précédent est appelé, on nous a demandé de ne pas montrer le retour (animation de gauche à droite), mais de montrer à l'utilisateur son déplacement vers le fragment suivant (animation de droite à gauche). Pour un exemple dans certains cas, l'utilisateur doit insérer les mêmes données encore et encore, donc au lieu de créer de nouveaux fragmnets pour ceux-ci, nous avons réutilisé les existants que nous avons créés - donc quand le viewPager.setCurrentItem() appelle un fragment à l'arrière (ex: nous sont maintenant dans le 20ème fragment et nous appelons le 10ème fragment) il remonte et montre l'animation de gauche à droite.Android: appels "onCreatedView" chaque fois que vous revenez et "setUserVisibleHint" n'est pas appelé

Maintenant, nous n'utilisons pas la méthode viewPager.setCurrentItem() pour naviguer, mais nous utilisons FragmentTransaction. Cependant, nous n'avons pas supprimé les fragments du ViewPager, en attendant de terminer ceci avec un minimum de travail (nous sommes à la fin du projet quand cette exigence est apparue).

Mais lorsque nous utilisons le FragmentTransaction, nous avons un nouveau problème maintenant. Quand nous revenons les onCreateView de fragmnets s'appellent tout le temps! Cela ne s'est pas produit lorsque nous utilisions viewPager.setCurrentItem(). Beaucoup de notre code qui devrait fonctionner une seule fois sont dans ce onCreateView.

Un autre problème est setUserVisibleHint() est appelé seulement dans le premier fragment et c'est aussi seulement à l'exécution initiale! Tout notre code qui devrait fonctionner à chaque fois que le fragmnet est affiché se trouve dans cette méthode. Ci-dessous un exemple de code qui illustre notre problème.

MainActivity.java

public class MainActivity extends FragmentActivity { 

    private ViewPager viewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     viewPager=(ViewPager)findViewById(R.id.viewPager); 
     viewPager.setAdapter(new MyPagerAdapter2(getSupportFragmentManager())); 
     viewPager.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (viewPager.getCurrentItem() == 0) { 
        return true; 
       } 

       if (viewPager.getCurrentItem() == 1) { 
        return true; 
       } 

       if (viewPager.getCurrentItem() == 2) { 
        return true; 
       } 

       if (viewPager.getCurrentItem() == 3) { 
        return true; 
       } 

       if (viewPager.getCurrentItem() == 4) { 
        return true; 
       } 

       return false; 
      } 
     }); 



    } 

    private class MyPagerAdapter2 extends FragmentPagerAdapter { 

     public MyPagerAdapter2(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      switch(pos) { 

       case 0: return FirstFragment1.newInstance("FirstFragment_1"); 
       case 1: return SecondFragment1.newInstance("SecondFragment_1"); 
       case 2: return ThirdFragment1.newInstance("ThirdFragment_1"); 
       case 3: return FourthFragment1.newInstance("FourthFragment_1"); 
       case 4: return FifthFragment1.newInstance("FifthFragment_1"); 
       default: return FirstFragment1.newInstance("DefaultFragment_1"); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 1; 
     } 
    } 

    public void setCurrentItem(int which) { 
     if(viewPager != null && which >= 0 && which <= 4) { 
      viewPager.setCurrentItem(which); 
     } 
    } 
} 

FirstFragment1.java

public class FirstFragment1 extends Fragment { 

    TextView textView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.first_frag_1, container, false); 

     TextView tv = (TextView) v.findViewById(R.id.tvFragFirst); 
     tv.setText("FRAGMENT 01"); 

     textView=(TextView)v.findViewById(R.id.textView1); 
     textView.setText("Fragment Name : - 01"); 

     Log.d("FRAGMENT_01", "ON_CREATE"); 

     Button button1 = (Button) v.findViewById(R.id.nextButton); 
     button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (getActivity() != null) { 

        FragmentManager fragmentManager=getFragmentManager(); 
        FragmentTransaction transaction = fragmentManager.beginTransaction(); 
        transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left); 
        transaction.replace(R.id.firstFragment, new SecondFragment1()); 
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        transaction.addToBackStack(null); 
        transaction.commit(); 
       } 
      } 
     }); 

     return v; 
    } 

    public static FirstFragment1 newInstance(String text) { 

     FirstFragment1 f = new FirstFragment1(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 

    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if (isVisibleToUser) { 
      Activity a = getActivity(); 
      if (a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 

     // textView.setText("Fragment Name : - 01"); 
      Log.d("FRAGMENT_01", "VISIBLE_HINT"); 

     } 
    } 

} 

SecondFragment1.java

public class SecondFragment1 extends Fragment { 

    TextView textView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.second_frag_1, container, false); 

     TextView tv = (TextView) v.findViewById(R.id.tvFragSecond); 
     tv.setText("FRAGMENT 03"); 

     textView=(TextView)v.findViewById(R.id.textView2); 
     textView.setText("Fragment Name : - 02"); 

     Log.d("FRAGMENT_02", "ON_CREATE"); 

     Button button=(Button)v.findViewById(R.id.printButton); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if(getActivity() != null) { 

        FragmentManager fragmentManager=getFragmentManager(); 
        FragmentTransaction transaction = fragmentManager.beginTransaction(); 
        transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left); 
        transaction.replace(R.id.secondFrag, new FirstFragment1()); 
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        transaction.addToBackStack(null); 
        transaction.commit(); 
       } 

      } 
     }); 

     Button button1=(Button)v.findViewById(R.id.nextButton); 
     button1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (getActivity() != null) { 

        FragmentManager fragmentManager=getFragmentManager(); 
        FragmentTransaction transaction = fragmentManager.beginTransaction(); 
        transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left); 
        transaction.replace(R.id.secondFrag, new ThirdFragment1()); 
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        transaction.addToBackStack(null); 
        transaction.commit(); 
       } 
      } 
     }); 

     return v; 
    } 

    public static SecondFragment1 newInstance(String text) { 

     SecondFragment1 f = new SecondFragment1(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 

    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if(isVisibleToUser) { 
      Activity a = getActivity(); 
      if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 

      Log.d("FRAGMENT_02","VISIBLE_HINT"); 


     } 
    } 

} 

Comme vous pouvez voir dans notre code, nous utilisons ci-dessous pour naviguer entre Fragments. (Ci-dessous le code montre la navigation de la première fragmnet à la seconde)

FragmentManager fragmentManager=getFragmentManager(); 
        FragmentTransaction transaction = fragmentManager.beginTransaction(); 
        transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left); 
        transaction.replace(R.id.firstFragment, new SecondFragment1()); 
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        transaction.addToBackStack(null); 
        transaction.commit(); 

En regardant notre code, et étant donné que nous avons ajouté le ViewPager ainsi, comment pouvons-nous assurer que onCreateView est appelée une seule fois et setUserVisibleHint est appelé à chaque fois que la fragment est affiché?

Répondre

0

Mettez tout votre code que vous voulez ne devrait pas être appelé à chaque fois dans onCreate() méthode et le code que vous voulez doit être appelé à chaque fois dans onCreateView() méthode.

+0

onCreate() est d'obtenir appel chaque fois que fragment est visible – Barrier

+0

lorsque vous faites glisser votre viewpager il ne sera appelé encore et encore. –

+0

Je ne suis pas en train de glisser le viewpager et j'utilise le bouton clic pour modifier le flux de fragments. – Barrier

1

Il existe des défis lors de l'utilisation de setUserVisibleHint.try viewPager.setOffscreenPageLimit (5); et utiliser la méthode de setMenuVisibility et si vous lancez l'application sur un fragment par notification

@Override 
public void setMenuVisibility(boolean menuVisible) { 
    super.setMenuVisibility(menuVisible); 
    if(menuVisible && isResumed()){ 
     // do your work here 
    } 
    if(!isResumed()){ 
     // do your work when Activity is created 
    } 
}