Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改屏幕旋转时,ViewPager片段消失_Java_Android_Android Fragments_Android Viewpager - Fatal编程技术网

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

Java 更改屏幕旋转时,ViewPager片段消失,java,android,android-fragments,android-viewpager,Java,Android,Android Fragments,Android Viewpager,我正在开发的android应用程序包含ViewPager和Fragments,如下所示: MainActivity(MainActivityFragment(ScreenSlideViewPage(Fragments))),这意味着: 活动包含片段包含查看页面包含片段s 现在我的问题是,当旋转设备或更改屏幕旋转时,ViewPager中的所有片段都会消失 有什么办法解决这个问题吗 编辑1 MainActivity.java: @Override protected void onCreate(Bu

我正在开发的android应用程序包含
ViewPager
Fragment
s,如下所示:

MainActivity
MainActivityFragment
ScreenSlideViewPage
Fragment
s))),这意味着:

活动
包含
片段
包含
查看页面
包含
片段
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();
    }
}
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;
        }
    }
}
编辑2

显然,
MainActivity
MainActivityFragment
已加载,证据是
ActionBar

还请注意,
ViewPager
也已加载,因为您仍然可以在页面之间导航(蓝色灯光表示页面已到达最后一页),但您无法看到其内容。

看起来您的主要活动是使用getSupportFragmentManager(),而您的片段则使用getFragmentManager()

我不确定这是否值得回复,但我的评分太低,无法以其他方式回复

编辑:我相信您可能还需要使用支持库扩展碎片活动

见:

编辑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;
        }
    }
}

避免再次创建viewpager。将onCreateView的代码放在onCreate()中。并使您的片段使用onRetainInstance(true)。因此,这不会重新创建片段,因为视图位于onCreate()中,所以不会再次调用它

在onCreateView()中检查该视图是否存在,如果存在,则将其删除。 片段:

//creates the view
private View createView(Bundle savedInstanceState) {
    View view = getActivity().getLayoutInflater().inflate(your_layout, null, false);

    //viewpager

    return view;
}

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

    //retains fragment instance across Activity re-creation
    setRetainInstance(true);

    viewRoot = createView(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    if (viewRoot != null && viewRoot.getParent() != null) {
        ViewGroup parent = (ViewGroup) viewRoot.getParent();
        parent.removeView(viewRoot);

        Log.i("Test", "**************view.getParent(): " + viewRoot.getParent() + "    " + viewRoot);
    }

    return viewRoot;
}

您应该使用
getChildFragmentManager()
而不是
getFragmentManager()
。 你曾经

mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getFragmentManager());
应该是的

mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getChildFragmentManager());

在你的片段中,我遇到了完全相同的问题。这是非常令人困惑的,但这条线索帮助了我,只是答案并没有真正解释它为什么起作用

解决此问题的方法是使用
Fragment.getChildFragmentManager()
。令人困惑的是android API有
Activity.getFragmentManager()
,但如果您试图支持较旧的设备,则需要使用
Activity.getSupportFragmentManager()
。然而,这个特殊的问题与支持旧的API无关

问题是您有一个活动,它有一个片段,该片段拥有ViewPager,而ViewPager拥有多个片段。碎片中有碎片!最初的片段设计并没有真正处理这个用例,后来进行了更新以处理它。当片段中包含片段时,需要使用:

Fragment.getChildFragmentManager()


片段中
可以选择
Fragment.getFragmentManager()
,它返回
活动
vs
Fragment.getChildFragmentManager()的
FragmentManager
为该
片段返回
片段管理器
,该管理器可在
片段
中正确确定
片段
的范围。对于存在此问题的片段,您可以尝试以下操作:

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();
}

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

我尝试了许多解决方案,但都取得了成功。最后我修正如下:

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

  • 在ViewPagerAdapter类中重写getItemId(int-position)方法,如下所示:

    @Override
    public long getItemId(int position) {
        return System.currentTimeMillis();
    }
    

对我来说,它工作起来很有魅力,请在这里评论你的观点。

在我的例子中,有一个活动A有片段F1,有片段V1,有片段F2,有片段V2,有片段F3。:)

最后一个片段F3在旋转时给出空白或错误

我的解决办法是:

  • 删除PageChangeListener,因此在更改片段时基本上不使用片段事务,而是保留默认设置
  • 使用FragmentStatePagerAdapter而不是FragmentPagerAdapter
  • 重写适配器中的getItemPosition()并返回位置\u NONE
  • 在适配器中创建一个包含片段列表的字段,并在构造函数中设置它
  • 在适配器的getItem()中,只需返回fragmentList.get(位置)
  • 在适配器的getCount()中,只返回fragmentList.size()
  • 不重写适配器中的任何其他方法,如销毁、实例化等
  • 在F2的onCreateView()中创建并实例化V2适配器
  • 编辑

    例如,当需要将F1中的V1替换为F2中的V2时,则:

  • 用F1\U容器id将V1括在相对布局内
  • 使用getSupportFragmentManager()并开始事务
  • 删除F1
  • 用F2替换F1_容器
  • 添加到后台
  • 提交事务
  • 稍后,当需要从F2返回F1时,对有效引用调用popBackStack()


    想想看,就是这样,花了一天多的时间改变了每一个,重新启动应用程序,并看到了结果。希望这能有所帮助。

    我一直在使用数据绑定,同时让片段A托管viewPager,到目前为止,旋转不是问题,但导航到片段B并返回,然后旋转才是问题所在。原来我是在分配
    parentFragmentManager
    而不是
    childFragmentManager
    。这就是Android开发的基本原理,我很不好意思忘记了这一点:)

    好问题,但我们需要更多的代码来帮助您!当Android中出现屏幕旋转时,您的活动将被销毁并重新创建。因此,您需要保存变量的状态,这样您就可以“继续”