簡體   English   中英

如何獲取MainActivity中ViewPager創建的片段元素?

[英]How to get elements of fragments created by ViewPager in MainActivity?

我有幾個用ViewPager組織的ViewPager 我在MainActivity的onCreate方法中將ViewPager添加到addOnPageChangeListener ,該方法給出了所選片段的位置。

即使我通過聲明setOffscreenPageLimit防止片段破壞自身,我仍然沒有弄清楚如何從MainActivity訪問片段,因為僅使用findViewById返回空對象異常。

我想做的事:

我想在OnPageListenerViewPager訪問片段的元素,例如布局和滾動ViewPager

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override
    public void onPageSelected(int i) {

        if(i == 0) {
            // Do something with the first fragment.
        } else if(i == 1) {
            // Do something with the second fragment.
        }

    }

}

ViewPager使用FragmentPagerAdapter

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                return Fragment1.newInstance(position);
            case 1:
                return Fragment2.newInstance(position);
            case 2:
                return Fragment3.newInstance(position);
            case 3:
                return Fragment4.newInstance(position);
            default:
                throw new IllegalArgumentException();
        }
    }

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

像這樣添加:

mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mSectionsPagerAdapter);

還是應該改變我的方法?

如果使用此設計無法訪問片段,那么什么是有效的替代途徑?

我嘗試在自定義ViewPager實現ViewPager.onPageChangeListener ,但這似乎不是一個好選擇。

我可以處理它們各自片段中的元素,但這是一個繁瑣的過程,並且很難維護,這就是我尋找一種同時處理它們的方法的原因。

我知道以前曾問過類似的問題,但我沒有找到解決方案。

不幸的是,唯一的“安全”方法是檢查FragmentPagerAdapter的源代碼,並查看該片段添加了什么tag -因為findFragmentByTag是從FragmentManager獲取片段的唯一安全方法。

當然,我們需要希望實現細節在支持庫版本之間不會改變,但實際上多年來沒有改變:)


無論如何,所以FragmentPagerAdapter說:

  // Do we already have this fragment? String name = makeFragmentName(container.getId(), itemId); Fragment fragment = mFragmentManager.findFragmentByTag(name); 

name什么呢?

 private static String makeFragmentName(int viewId, long id) { return "android:switcher:" + viewId + ":" + id; } 

什么是viewId ,什么是id

ViewId是container.getId() ,其中containerViewPager本身。

id是: final long itemId = getItemId(position); 默認情況下是return position;


因此,您可以找到片段,如下所示:

Fragment fragment = fragmentManager.findFragmentByTag("android:switcher:" + viewPager.getId() + ":" + fragmentPosition);
// if fragment is null, it was not created yet by ViewPager

注意:

值得注意的是,您不應該依賴getItem(int position) {返回傳入的片段實例 ,因為那樣會導致此問題 (此問題正確執行, getItem()方法必須始終返回新的Fragment實例。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM