繁体   English   中英

带有片段的ViewPager:方向更改后崩溃(显示不正确的片段)

[英]ViewPager with fragments: crash after orientation change (incorrect fragment displayed)

我有一个带有PagerTitleStrip的ViewPager,它可以绘制片段。 每个片段都有一个StableArrayAdapter,它将信息填充到片段中。

方向更改后,当我单击片段时,出现崩溃: java.lang.IndexOutOfBoundsException: Index: 8, Size: 7

产生方向更改后,我可以看到与方向更改之前相同的片段页面。 但是,如果我单击它,则会导致崩溃,因为viewpager可能已加载了第一个片段而不是所选片段。

似乎在产生方向更改时,正在重新创建活动(我想要它,因为我希望从admob生成的智能横幅以新宽度重新创建),但是该片段可能没有被重新创建或类似的东西,所以它可能指向了与涂漆的碎片不同

如何避免此崩溃? 也许有一种方法可以告诉Viewpager它必须加载正在显示的页面? 那怎么办?

我尝试存储当前的片段号并在重新创建时选择它,但是崩溃仍然在发生:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putInt("current_item", viewPager.getCurrentItem());
    super.onSaveInstanceState(savedInstanceState);
}
.
.
.
//code in onCreate()
viewPager.setAdapter(collectionPagerAdapter);
if (savedInstanceState != null) {
            int currentItem = savedInstanceState.getInt("current_item");                
            viewPager.setCurrentItem(currentItem);
}

这是我的xml布局。

<android.support.v4.view.ViewPager
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/pager"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginBottom="3dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintBottom_toTopOf="@+id/adView">
            <android.support.v4.view.PagerTitleStrip
                android:id="@+id/pager_title_strip"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="top"
                android:paddingTop="4dp"
                android:paddingBottom="4dp"
                style="@style/CustomPagerTitleStrip"/>
        </android.support.v4.view.ViewPager>

这是StableArrayAdapter中崩溃的行,其中用行填充了片段

Override public long getItemId(int position) { 
    return Math.abs(getItem(position).hashCode()); 
} 

您可以通过下面的链接,他们解释了如何处理Fragments和viewPager方向更改。

https://medium.com/@roideuniverse/android-viewpager-fragmentpageradapter-and-orientation-changes-256c23bee035

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM