![](/img/trans.png)
[英]findFragmentById returns null after implementing ViewPager
[英]Nested ViewPager returns null after rotation
我需要在PageFragSanningellerKonsekvens
對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:我認為它與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.