Java 更改屏幕旋转时,ViewPager片段消失
我正在开发的android应用程序包含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
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()
,它返回活动
vsFragment.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中出现屏幕旋转时,您的活动将被销毁并重新创建。因此,您需要保存变量的状态,这样您就可以“继续”