【问题标题】:ViewPager designed to work in Portrait mode recreates fragments on orientation changeViewPager 设计为在纵向模式下工作,可在方向更改时重新创建片段
【发布时间】:2014-09-12 17:00:24
【问题描述】:

在处理 ViewPager 片段和方向更改时,我遇到了一个相当奇怪的问题。 我的问题用最简单的描述如下:

我的应用程序有一个活动 (MainActivity),旨在同时在纵向和横向模式下工作。我在不同的方向使用不同的布局——一个纵向的 ViewPager 和一个在横向上具有完全不同视图的简单片段。这两个组件彼此独立。

我在 ViewPager 片段和横向片段中使用的片段代码很简单 - 我膨胀视图的 onAttach()、onDetach() 和 onCreateView() 被覆盖。

当我改变方向时,我并不真正关心保留片段,因为我展示的是完全不同的布局。但是,我的问题是 ViewPager 片段在横向模式下被销毁并重新创建(onDestroy() -> onDetach() -> onAttach() -> onCreate() -> onCreateView()),即使不可见。

是否有一种解决方法可以在方向更改时不重新创建这些片段?

我的 MainActivity 的 onCreate() 代码如下,我在 onCreate() 中检查方向以确定需要初始化哪些视图组件。

private ViewPager mPager;

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

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    setContentView(R.layout.activity_main);

    ActionBar actionBar = getActionBar();
    actionBar.setLogo(R.drawable.empty);
    actionBar.setTitle(R.string.empty);

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        mPager = (ViewPager) findViewById(R.id.portraitviewpager);
        if (mPager != null) {
            mPager.setAdapter(new SectionsPagerAdapter(getSupportFragmentManager()));
            mPager.setPageTransformer(false, new DepthPageTransformer());
            mPager.setCurrentItem(HOME);    
        }
    } 

}

另外,为了让事情更简单,我的 SectionsPagerAdapter 代码如下:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    private static final int PAGE_COUNT = 2;

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case MAIN_MENU:
            return MainMenuFragment.newInstance();
        case HOME:
            return HomeFragment.newInstance();
        }
        return null;
    }

    @Override
    public int getCount() {
        return PAGE_COUNT;
    }

}

【问题讨论】:

    标签: android-fragments android-viewpager


    【解决方案1】:

    setRetainInstance(true); 添加到ViewPager 片段的onAttach(Activity activity)


    一如既往地开放以供更正! 问候, 爱德华·吉诃德。

    【讨论】:

    • setRetainInstance(true) 不会在方向更改时重新创建片段。但是我对纵向和横向使用不同的布局,当我在方向改变后再次回到纵向模式时,我不得不引用我的寻呼机并再次创建片段,这对我的事业没有帮助。我可以在创建一次后在方向更改时根本不重新创建片段,或者在需要显示它们时创建它们(如果它是风景片段,则仅在风景中重新创建,反之亦然)。我不认为 setRetainInstance 在那种情况下会有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多