5

tôi đã sử dụng một ViewPager và một ActionBar với NavigationMode: "NAVIGATION_MODE_TABS"Gọi onStart() của Fragment trước để hiển thị ViewPager, navigation_mode_tabs

tôi đặt 3 Những mảnh vỡ: Fragment0 (tab bên trái), Fragment1 (tab giữa), Fragment2 (tab bên phải)

Thứ nhất, Fragment0 xuất hiện và các phương pháp "onCreateView" và "onStart" đang kêu gọi Fragment0 vÀ Fragment1

Nếu tôi trượt ngang để đi đến "tab giữa" (Fragment1), các phương thức "onCreateView" và "onStart" của Fragment2 (tab bên phải) được gọi là ...

Vì vậy, tôi muốn biết điều này có bình thường không?

Vì tôi muốn gọi "onStart" của Fragment2 ngay trước khi nó xuất hiện, Làm thế nào?

Mã của tôi:

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

Một 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; 

    } 

} 

PagerAdapter của tôi:

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

Trả lời

4

Đó là hoàn toàn bình thường đối với một Fragment phải đi qua onCreateView sau đó onStart. Bạn có thể muốn xem Fragment Lifecycle.

Nếu tôi hiểu chính xác khi bạn nói "ngay trước khi nó xuất hiện", thì tôi nghĩ phương pháp vòng đời bạn đang tìm kiếm là phương pháp onResume. Đây là cái cuối cùng được gọi trước khi mảnh được kích hoạt.

+1

Vì vậy, bù đắp là bình thường, nhưng làm cách nào tôi có thể buộc cuộc gọi tại "onStart" hoặc "onCreateView" hoặc "onResume" juste trước khi nó xuất hiện (hoặc tại thời điểm xuất hiện)? vì tôi sử dụng ListView trong Fragment1 khi tôi chọn một mục, Fragment2 được hiển thị nhưng "onStart"/"onCreateView"/"onResume" của nó không được gọi ... Tôi muốn cập nhật – bzhWarrior

+0

Đó là các sự kiện vòng đời cho miếng. Các sự kiện khởi động được gọi là mọi lúc, một số sự kiện kết thúc vòng đời có thể không được gọi do bộ nhớ được hệ điều hành thu hồi. – TronicZomB

Các vấn đề liên quan