0

我正在開發一個Android應用程序,其中我的MainActivity中有一個ViewPager,由3個片段組成。 問題如下,當我滑動到第三個片段,並返回到第一個,片段1的onCreateView被調用,這是我真正想要的,但是,如果我只是甩到第二個片段,並返回到第一個,onCreateView不叫! 我需要找到解決這個問題的辦法,我花了幾個小時試圖找到一個解決方案,但不知道解決它。 下面是我的MainActivity相關ViewPager代碼使用ViewPager時不會調用CreateView上的片段使用ViewPager

private void setupViewPager(final ViewPager viewPager) { 
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFrag(new voting(), "ONE"); 
    adapter.addFrag(new dashboard(), "TWO"); 
    adapter.addFrag(new chats(), "THREE"); 
    myAdapter=adapter; 
    viewPager.setAdapter(adapter); 
    viewPager.setOffscreenPageLimit(0); 
} 

private class ViewPagerAdapter extends FragmentStatePagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<Fragment>(); 
    private final List<String> mFragmentTitleList = new ArrayList<String>(); 

    private ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Log.i("getItem","getItem"); 
     return mFragmentList.get(position); 
    } 


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

    private void addFrag(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    //added newly 
    @Override 
    public int getItemPosition(Object object){ 
     return PagerAdapter.POSITION_NONE; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return null; 
    } 
} 
+0

「如果我只轉到第二個片段並返回到第一個片段,onCreateView不會被調用」 - 如果您的意思是onCreateView()沒有在第一個片段上再次調用,那是非常正常的。 「我需要找到解決這個問題的辦法」 - 你爲什麼認爲這是一個問題? – CommonsWare

+0

@CommonsWare是的,這就是我的意思,但沒有找到解決方案 –

回答

1

這是爲了與FragmentPagerAdapter行爲。如果片段已經被創建並且仍然在內存中,它將重新連接到ViewPager。因此,onCreateView(...)之所以不被稱爲第二次。

實現PagerAdapter,將每個頁面表示爲片段,只要用戶可以返回頁面,該片段就永久保存在片段管理器中。

您使用的FragmentStatePagerAdapterFragmentPagerAdapter的子類,因此它會繼承此行爲。

通常,在每次頁面更改時重新創建視圖並不是一個好主意,因爲這樣很昂貴並且可能導致不平滑的滾動。如果您在onCreateView(...)中有一些邏輯需要在每個片段更改時再次運行,那麼我建議您查看ViewPager.OnPageChangedListener

+0

如果我的邏輯與onCreateView和ViewGroup中的inflater有什麼關係,那該怎麼辦?我怎麼能從mainActivity執行這個邏輯? –

+1

使用inflater創建視圖,並在片段中保存對這些視圖的引用以便稍後與其交互。除非你是由於某種原因動態創建視圖,否則你不應該在'onCreateView(...)'之後需要一個充氣器。 更新您的問題與您的inflater用例,也許我們可以建議一個更好的模式:) – Jon

相關問題