5

użyłem ViewPager oraz ActionBar z NavigationMode: "NAVIGATION_MODE_TABS"połączeń onStart() fragmentu przed wyświetlać Viewpager, navigation_mode_tabs

włożyłem 3 Fragmenty: Fragment0 (lewa zakładka), Fragment1 (zakładka środku), Fragment2 (zakładka po prawej) wydaje

pierwsze, Fragment0 i metody „onCreateView” i „onStart” nazywane są dla Fragment0 a Fragment1

Gdybym przesuwać poziomo, aby przejść do zakładki „środkowego” (Fragment1) metody "onCreateView" i "onStart" w Fragment2 (prawa zakładka) są nazywane ...

Więc, chcę wiedzieć, czy to normalne?

Ponieważ chcę wywołać "onStart" fragmentu 2 tuż przed pojawieniem się, jak to zrobić?

Mój kod:

public class ActivityPrincipale extends FragmentActivity { 
    private Intent intentService1; 
    private Fragment fragment; 
    [..] 
    private ActionBar.TabListener tabListener; 

    @Override 
    protected void onCreate(Bundle arg0) { 
     super.onCreate(arg0);   
     setContentView(R.layout.viewpager); 
     // Création de la liste de Fragments que fera défiler le PagerAdapter 
     listFragments = new Vector(); 

     // Ajout des Fragments dans la liste des fragments 
     listFragments.add(Fragment.instantiate(this, Fragment0.class.getName())); 
     listFragments.add(Fragment.instantiate(this, Fragment1.class.getName())); 
     listFragments.add(Fragment.instantiate(this, Fragment2.class.getName())); 

     // Création de l'adapter qui s'occupera de l'affichage de la liste de Fragments 
     this.mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(), listFragments); 

     pagerView = (ViewPager) super.findViewById(R.id.viewpager); 

     // affectation de l'adapter au ViewPager 
     pagerView.setAdapter(this.mPagerAdapter); 

     pagerView.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       // Quand il y a un swapp entre les page 
       // on selectionne le tab correspondant 
       Log.w("SWAPPING FRAGMENT!!", "swapping de fragment avec comme positin de destination = " + position); 
       getActionBar().setSelectedNavigationItem(position); // DEBUGMODE 

      } 
     }); 

     actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Create a tab listener that is called when the user changes tabs. 
     tabListener = new ActionBar.TabListener() { 

      public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {    
       pagerView.setCurrentItem(tab.getPosition()); 
      } 
      public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {    
      } 
      public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {     
      } 
     }; 

     actionBar.addTab(actionBar.newTab().setText("Frag0").setTabListener(tabListener)); 
     actionBar.addTab(actionBar.newTab().setText("Frag1"").setTabListener(tabListener)); 
     actionBar.addTab(actionBar.newTab().setText("Frag2").setTabListener(tabListener)); 
    } 
} 

jeden fragment:

public class Fragment0 extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_0, container, false); 
     Log.w("oFragmento", "fragment0"); 
     return rootView; 

    } 

} 

Moja PagerAdapter:

public class MyPagerAdapter extends FragmentPagerAdapter { 

    private final List fragments; 

    public MyPagerAdapter(FragmentManager fm, List list_fragments) { 
     super(fm);  
     this.fragments = list_fragments; 
    } 

    @Override 
    public Fragment getItem(int position) {   
     return (Fragment) fragments.get(position); 
    } 

    @Override 
    public int getCount() {   
     return this.fragments.size(); 
    } 
} 

Odpowiedz

4

To jest zupełnie normalne dla fragmentu przejść onCreateView następnie onStart. Być może warto przyjrzeć się Fragment Lifecycle. Jeśli dobrze rozumiem, kiedy mówisz "tuż przed pojawieniem się", to myślę, że metoda cyklu życia, którego szukasz, to metoda onResume. Jest to ostatnia nazwa, którą należy wywołać przed aktywacją fragmentu.

+1

Tak więc przesunięcie jest normalne, ale jak mogę wymusić wywołanie "onStart" lub "onCreateView" lub "onResume" tuż przed pojawieniem się (lub w momencie pojawienia się)? ponieważ używam ListView w Fragment1, gdy wybrałem element, Fragment2 jest wyświetlany, ale jego "onStart"/"onCreateView"/"onResume" nie jest nazywane ... Chciałbym zaktualizować – bzhWarrior

+0

Są to zdarzenia cyklu życia dla fragment. Zdarzenia startowe są wywoływane za każdym razem, niektóre z zakończonych zdarzeń cyklu życia mogą nie zostać wywołane z powodu odzyskania pamięci przez system operacyjny. – TronicZomB

Powiązane problemy