繁体   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