我需要在VerticalViewPager
中引用PageFragSanningellerKonsekvens
。
我得到了两个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:我认为它与
getItem()
中的FragmentStatePagerAdapter
有关。在每个给定时间将分配3个片段。我认为这可能会使getVerticalViewPager()
方法无效。编辑2:我移动了一些代码,以允许
ViewPager
和按钮可以在同一类中进行初始化,因此使其具有防空性。谢谢您的帮助! 最佳答案
好的,这可能不是一个完整的答案,但我认为这将是一个太长的评论。
我认为您是对的,空指针发生在适配器的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);