【发布时间】:2018-04-02 09:38:35
【问题描述】:
我有一个带有 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());
}
【问题讨论】:
-
如果你没有改变方向改变任何东西,你可以在你的清单文件中使用
android:configChanges="orientation"。 -
是的,我正在改变一些事情,我在问题中告诉过你:“正在重新创建活动(我想要它,因为我希望 admob 的智能横幅以新的宽度重新创建)”
标签: android android-fragments android-viewpager fragment pagertitlestrip