5

我使用的ViewPager並用NavigationMode的動作條: 「NAVIGATION_MODE_TABS」呼叫調用onStart()片段的前顯示Viewpager,navigation_mode_tabs

我把3個片段:Fragment0(左標籤),片段1(中間片),Fragment2 (右選項卡)

首先,Fragment0出現和方法「onCreateView」和「在onStart」的呼籲Fragment0和片段1

如果我滑水平去「中間卡」(片段1) Fragment2(右標籤)中的方法「onCreateView」和「onStart」被稱爲...

所以,我想知道這是否正常?

因爲我想在它出現之前調用Fragment2的「onStart」,它怎麼做?

我的代碼:

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)); 
    } 
} 

一個片段:

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; 

    } 

} 

我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(); 
    } 
} 

回答

4

這是完全正常的片段要經過onCreateView然後onStart。您可能想看看Fragment Lifecycle.

如果我在「剛好出現之前」說的時候正確理解了您,那麼我認爲您正在尋找的生命週期方法是onResume方法。這是片段處於活動狀態之前要調用的最後一個。

+1

因此偏移量是正常的,但是我怎麼能在出現之前(或出現時)在「onStart」或「onCreateView」或「onResume」上強制調用? 因爲我使用Fragment1內的ListView當我選擇一個項目,Fragment2顯示,但他的「onStart」/「onCreateView」/「onResume」它不叫...我想更新 – bzhWarrior

+0

那些是生命週期事件分段。每次調用啓動事件時,由於操作系統回收內存,可能不會調用某些結束生命週期事件。 – TronicZomB