簡體   English   中英

旋轉后嵌套的ViewPager返回null

[英]Nested ViewPager returns null after rotation

我需要在PageFragSanningellerKonsekvensVerticalViewPagerPageFragSanningellerKonsekvens

我有兩個ViewPagers:一個用於永久進行水平滑動,另一個用於垂直滑動,加載三個片段(中間,向上滑動,向下滑動),這些片段加載內容。 水平ViewPager每次滑動都會加載VerticalViewPager的新實例。 我需要在VerticalViewPager加載的實際片段中的引用,以便可以通過點擊按鈕垂直滑動。 我還需要對水平ViewPager的引用,以允許第一頁具有觸發水平滑動的按鈕。

我已經通過將引用作為參數發送來解決了這個問題:

FragSanningEllerKonsekvens初始化VerticalViewPager的類。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_sanning_eller_konsekvens, container, false);
    initComponents();
    setComponents();
    return view;
}

private void initComponents() {
    verticalViewPager = (VerticalViewPager) view.findViewById(R.id.verticalviewpager);
    mStatementPagerAdapter = new TruthDarePagerAdapter(getChildFragmentManager()).newInstance(getChildFragmentManager(),mViewPager, verticalViewPager);
}

它在TruthOrDarePagerAdapter傳輸:

private ViewPager mViewPager;
private VerticalViewPager mVerticalViewPager;
public static TruthDarePagerAdapter newInstance(FragmentManager fm, ViewPager mViewPager, VerticalViewPager mVerticalViewPager){
    TruthDarePagerAdapter horizontalPagerAdapter = new TruthDarePagerAdapter(fm);
    horizontalPagerAdapter.setViewPager(mViewPager);
    horizontalPagerAdapter.setVerticalViewPager(mVerticalViewPager);
    return horizontalPagerAdapter;
}


public VerticalViewPager getVerticalViewPager() {
    return mVerticalViewPager;
}

public void setVerticalViewPager(VerticalViewPager mVerticalViewPager) {
    this.mVerticalViewPager = mVerticalViewPager;
}

private void setViewPager(ViewPager mvViewPager){
    this.mViewPager = mvViewPager;
}

private ViewPager getViewPager(){
    return mViewPager;
}

@Override
public Fragment getItem(int position) {
    PageFragSanningellerKonsekvens frag = new PageFragSanningellerKonsekvens().newInstance(getViewPager(), getVerticalViewPager());
.
.
.
    return frag;
}

PageFragSanningellerKonsekvens需要引用的類。

public static PageFragSanningellerKonsekvens newInstance(ViewPager mViewPager, VerticalViewPager mVerticalViewPager){
    PageFragSanningellerKonsekvens frag = new PageFragSanningellerKonsekvens();
    frag.setViewPager(mViewPager);
    frag.setVerticalViewPager(mVerticalViewPager);
    return frag;
}


private void setupMenu() {


    viewTop = view.findViewById(R.id.sek_top);
    viewBottom = view.findViewById(R.id.sek_bottom);

    viewTop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getVerticalViewPager().setCurrentItem(0, true);
        }
    });

    viewBottom.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getVerticalViewPager().setCurrentItem(2, true);
        }
    });
}

在我旋轉設備之前,上面的代碼非常有效。 旋轉后, getVerticalViewPager()返回null 在應用程序的其他部分中,我使用此模式沒有任何問題:旋轉時,將ViewPager作為參數發送,並且應用程序在不刪除引用的情況下重新加載。

因此,我得出的結論是, VerticalViewPager不會在旋轉時重新初始化,而PageFragSanningellerKonsekvens是。

我的問題是; 我該如何解決? 我可以強迫它重新初始化,還是可以其他方式獲得對它的引用?

編輯1:我認為它與FragmentStatePagerAdapter中的getItem()有關。 在每個給定時間將分配3個片段。 認為這可能會使getVerticalViewPager()方法無效。

編輯2:我移動了一些代碼,以允許在同一類中初始化ViewPager和按鈕,從而使其在某種程度上為null。 謝謝您的幫助!

好的,這可能不是一個完整的答案,但我認為這將是一個太長的評論。

我認為您是對的,空指針發生在適配器的getItem上。 (一個logcat報告確認這會很好)。 這樣做的原因(我認為)是適配器試圖在完成ViewPager的填充之前重新創建內部片段。 通常,我在onCreate中創建類似的適配器,因為它通常不依賴任何片段管理器。

考慮到這一點,以及您可能很難避免當前設計中的空指針這一事實,我提出了一個新設計。

現在僅在我的電話旁,因此很難為您提供我所記住的代碼。 現在,我只是勾勒出這個想法:

  • 將ViewPagers的getter / setter從適配器移至FragSanningEllerKonsekvens,而TruthOrDarePagerAdapter的創建僅取決於片段管理器

  • 現在對PageFragSanningellerKonsekvens進行相同的操作,使其在適配器的getItem中只是PageFragSanningellerKonsekvens.newInstance()

  • 最后,您現在在PageFragSanningellerKonsekvens中缺少對ViewPagers的引用,但請記住,您現在在父FragSanningEllerKonsekvens中擁有兩個ViewPagers的吸氣劑。

因此,按鈕現在變為:

((FragSanningEllerKonsekvens)getParentFragment()).getVerticalViewPager().setCurrentItem(0, true);

((FragSanningEllerKonsekvens)getParentFragment()).getVerticalViewPager().setCurrentItem(2, true);

暫無
暫無

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

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