方向更改时处理ViewPager中的碎片

时间:2016-08-17 21:43:40

标签: android

我从今天早上起就一直在用viewpager处理屏幕旋转,我尝试了很多东西,我几乎每篇文章都在这里读到这个,我无法找到我的问题。

问题

  1. 当我更改内容时,它会删除3或4页,我必须向右滑动3或4次才能看到其他页面。从肖像到肖像几乎每次都有效,没有页面被删除,但如果我从纵向移动到横向,页面就会消失
  2. 我在其中一篇文章中读到,这是因为当方向改变时片段被破坏,我们需要使用setRetainInstance(true);在里面创建来解决这个问题,但它不起作用,我在这里错过了一些东西吗?

        public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
    
        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).
            if (position <= (arraySize - 1)) {
                HashMap<String, String> data = computeQuestion(questoes[randomize.get(position)]);
                return PlaceholderFragment.newInstance(position + 1, data, tables[randomize.get(position)]);
            } else {
                return FragmentResultados.newInstance(position + 1);
            }
        }
    
        @Override
        public int getCount() {
            return arraySize + 1; // number of pages + ending page
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "SECTION 1";
                case 1:
                    return "SECTION 2";
                case 2:
                    return "SECTION 3";
                default:
                    return String.valueOf(position);
            }
        }
        }
    

    片段

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

    修改

    片段

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_exame, container, false);
    
            mViewPager = (ViewPager) getActivity().findViewById(R.id.container);
            mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
            mViewPager.setAdapter(mSectionsPagerAdapter);
            return rootView;
        }
    

    结果:IllegalStateException:FragmentManager已在执行事务

    活动

     private static ViewPager mViewPager;
     private static FragmentStatePagerAdapter mSectionsPagerAdapter;  
    
          @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_exame2);
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        }
    

    清单

     <activity
            android:name=".Exame"
            android:label="@string/title_activity_exame"
            android:theme="@style/AppTheme"
            android:configChanges="keyboardHidden|orientation|screenSize"/>
    

    activity_xml

    <android.support.design.widget.CoordinatorLayout      xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="pt.condutorresponsavel.android.testescodigo.Exame">
    
    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <android.support.v4.view.ViewPager
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    
    <ImageView
        android:id="@+id/arrowLeft"
        android:background="@color/colorPrimary"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_first_page_white_24dp"
        android:paddingLeft="10dp"
        android:paddingTop="3dp"
        android:paddingRight="10dp"
        android:paddingBottom="3dp"
        android:onClick="toFirst"
       />
    
    <ImageView
        android:background="@color/colorPrimary"
        android:onClick="toLast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_last_page_white_24dp"
        android:paddingLeft="10dp"
        android:paddingTop="3dp"
        android:paddingRight="10dp"
        android:paddingBottom="3dp"
        android:layout_alignParentRight="true"
        android:id="@+id/arrowRight" />
    
    <TextView
        android:id="@+id/timeleft"
        android:textColor="#ffffff"
        android:background="@color/colorPrimary"
        android:paddingRight="10dp"
        android:paddingLeft="5dp"
        android:gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="20:01"
        android:layout_alignBottom="@+id/arrowRight"
        android:layout_toLeftOf="@+id/arrowRight"
        android:layout_toStartOf="@+id/arrowRight"
        android:layout_alignParentTop="true" />
    

    我将代码的示例上传到github

    固定

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

3 个答案:

答案 0 :(得分:1)

你使用android支持库吗?这可能是一个问题。另外在这里看一下类似的问题: ViewPager fragments disappear when change screen rotation

答案 1 :(得分:0)

我知道现在已经很晚了 我使用this修复了同样的问题。

答案 2 :(得分:0)

如果您的片段页面消失,那么它将起作用: -

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

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