更改屏幕旋转时ViewPager片段消失

Hey*_*ibi 30 java android android-fragments android-viewpager

我的工作包含Android应用程序ViewPagerFragmentS,这样的:

MainActivity(MainActivityFragment(screenSlideViewPager(Fragments))),意思是:

Activity contains Fragment contains ViewPager 包含 Fragment s

现在我的问题是当旋转设备或更改屏幕旋转时,ViewPager中的所有碎片都消失了.

有什么想法来解决这个问题吗?

编辑1

MainActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getSupportFragmentManager().findFragmentByTag(TAG) == null) {
        final FragmentTransaction ft = getSupportFragmentManager()
                .beginTransaction();
        ft.add(android.R.id.content, new MainActivityFragment(), TAG);
        ft.commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

MainActivityFragment.java:

public class MainActivityFragment extends Fragment {
    private ViewPager mPager = null;
    private PagerAdapter mPageAdapter = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View reVal = inflater.inflate(R.layout.activity_main, container, false);
        mPager = (ViewPager) reVal.findViewById(R.id.pagerMainContent);
        mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getFragmentManager());
        mPager.setAdapter(mPageAdapter);
        return reVal;
    }

    private MainGridViewFragment mainGridFragment;
    private AlphabetGridViewFragment alphabetGridFragment;

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public android.app.Fragment getItem(int position) {
            switch (position) {
                case 1:
                    mainGridFragment = new MainGridViewFragment();
                    return mainGridFragment;
                case 0:
                    alphabetGridFragment = new AlphabetGridViewFragment();
                    return alphabetGridFragment;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2 屏幕旋转后的活动

显然,MainActivityMainActivityFragment被加载,并且证明的ActionBar,还要注意ViewPager被装入了,因为你仍然可以在页面之间导航(蓝光意味着寻呼机达到最后一页),但你看不到它的内容.

Jon*_*Jon 19

当您的片段使用getFragmentManager()时,看起来您的主要活动是使用getSupportFragmentManager().

不确定这是否值得回答帖子,但我的评级太低,无法以任何其他方式回复.:)

编辑:我相信您可能还需要使用支持库扩展FragmentActivity.

请参阅:https://stackoverflow.com/a/10609839/2640693

编辑2:

public class MainActivityFragment extends FragmentActivity {
    private ViewPager mPager = null;
    private PagerAdapter mPageAdapter = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View reVal = inflater.inflate(R.layout.activity_main, container, false);
        mPager = (ViewPager) reVal.findViewById(R.id.pagerMainContent);
        mPageAdapter = new ScreenSlidePagerAdapter(getChildFragmentManager());
        mPager.setAdapter(mPageAdapter);
        return reVal;
    }

    private MainGridViewFragment mainGridFragment;
    private AlphabetGridViewFragment alphabetGridFragment;

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 1:
                    mainGridFragment = new MainGridViewFragment();
                    return (Fragment)mainGridFragment;
                case 0:
                    alphabetGridFragment = new AlphabetGridViewFragment();
                    return (Fragment)alphabetGridFragment;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 哇!`getChildFragmentManager()`为我做了诀窍. (7认同)
  • 看起来像getChildFragmentManager()有助于解决我的类似问题 (6认同)

Kal*_*esh 7

我尝试了很多解决方案,但在任 最后我修复如下:

  • 使用getActivity().getSupportFragmentManager()而不是getChildFragmentManager()

  • 覆盖ViewPagerAdapter类中的getItemId(int position)方法,如下所示:

    @Override
    public long getItemId(int position) {
        return System.currentTimeMillis();
    }
    
    Run Code Online (Sandbox Code Playgroud)

对我而言,它的工作就像魅力,请在这里评论您的观点.

  • 覆盖getItemId极大地帮助了我。我从来没有想过。我猜测ViewPager必须以某种方式基于ID缓存片段。无论哪种方式,谢谢。 (2认同)

Tia*_*ira 5

对于有此问题的人,您可以尝试以下操作:

private void InitializeUI(){
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);

}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.activity_exame2);
InitializeUI();
}
Run Code Online (Sandbox Code Playgroud)

我花了 2 天时间解决这个问题,这是唯一对我有用的方法,记得在清单中将 android:configChanges="screenSize|orientation" 添加到您的活动中