Android ViewPager(带有pagetransformer动画)在旋转屏幕时崩溃
我刚刚注意到,如果我使用DepthPageTransformer()动画,当将屏幕纵向旋转到横向时,应用程序会崩溃。Android ViewPager(带有pagetransformer动画)在旋转屏幕时崩溃,android,android-viewpager,fragmentpageradapter,Android,Android Viewpager,Fragmentpageradapter,我刚刚注意到,如果我使用DepthPageTransformer()动画,当将屏幕纵向旋转到横向时,应用程序会崩溃。 崩溃原因是NullPointerException:(但这与我的数组列表或对象无关。已经添加了原因。并且已经添加了调试结果。如果我不使用任何转换器,应用程序工作得很好。) 这是第一条错误线 在android.support.v4.view.ViewPager.getChildDrawingOrder(ViewPager.java:800)中 这意味着mDrawingOrdered
崩溃原因是NullPointerException:(但这与我的数组列表或对象无关。已经添加了原因。并且已经添加了调试结果。如果我不使用任何转换器,应用程序工作得很好。) 这是第一条错误线 在android.support.v4.view.ViewPager.getChildDrawingOrder(ViewPager.java:800)中 这意味着mDrawingOrderedChildren是空的。为什么会这样,我不知道。。。
通过调试,我注意到:
如果我禁用/注释setPageTransformer(true,new DepthPageTransformer()),则应用程序运行良好
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
// if uncomment here,app crashes when rotating screen.
// viewPager.setPageTransformer(true,new DepthPageTransformer());
}
和DepthPageTransformer.java
public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f;
@Override
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 0) { // [-1,0]
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
view.bringToFront();
} else if (position <= 1) { // (0,1]
// Fade the page out.
view.setAlpha(1 - position);
// Counteract the default slide transition
view.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
我认为问题出在DepthPageTransformer中,但我仍然无法解决。在建议中感谢您(并感谢您在未阅读整个问题的情况下否决并关闭请求)。只需在清单文件中添加这一行即可
<activity
-----
-----
android:configChanges="orientation|screenSize" >
</activity>
希望这有助于您可能重复的“是”,我找到了它抛出NPE错误的原因,并写道“这意味着mDrawingOrderedChildren为空。为什么会发生,我不知道…”我不知道为什么mdrawingorderedchildren是空的。谢谢你的否决投票和很好的回答!帮助了我很多!!你的应用程序崩溃了,因为每当你改变你的旋转活动刷新时,我都无法捕捉getActivity().getResources().getConfiguration().orientation==Configuration.orientation\u Fragment oncreateview中的纵向?如果纵向显示它的2列,如果横向显示3列,则显示StaggedGridLayoutManager,但现在它没有正确检测到它。我检查方向纵向与否,并获取R.integer.column\u大小(正常、小、大、xlarge)不同的值。但现在它无法正确检测。如果我在我的应用程序中不使用任何pagetransformer之类的深度,它就可以正常工作,而不会添加任何内容来显示。为什么会发生这种情况,我真的不知道。
public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f;
@Override
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 0) { // [-1,0]
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
view.bringToFront();
} else if (position <= 1) { // (0,1]
// Fade the page out.
view.setAlpha(1 - position);
// Counteract the default slide transition
view.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
public class ViewPagerAdapter extends FragmentPagerAdapter{
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
return HomeFragment.newInstance("Home");
case 1:
return AFragment.newInstance("a");
case 2:
return BFragment.newInstance("b");
case 3:
return CFragment.newInstance("c");
default:
return HomeFragment.newInstance("home");
}
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0: return "Home";
case 1: return "A";
case 2: return "B";
case 3: return "C";
}
return null;
}
@Override
public int getCount() {
return 4;
}
}
<activity
-----
-----
android:configChanges="orientation|screenSize" >
</activity>