【问题标题】:How to prevent a fragment in a fragment pager from being recreated on orientation change?如何防止在方向更改时重新创建片段寻呼机中的片段?
【发布时间】:2016-06-10 01:10:41
【问题描述】:

我知道,通常对于片段,您可以在活动的 onCreate 中执行类似的操作来检索已创建的片段,该片段在方向更改时具有 .setRetainInstance(true),而不是创建新片段:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        TestFragment test = new TestFragment();
        test.setArguments(getIntent().getExtras());
        getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit();
    } else {
        TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag");
    }
}

我的问题是如何保留和检索视图页面中的此类片段?重新创建片段不是我想要的。即使我可以检索这些片段标记,viewpager 也会处理附加片段,因此似乎无法检查现有片段并检索它而不是创建一个新片段。这是我的活动和寻呼机:

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(new PagerAdapter(getSupportFragmentManager()));


    }

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

        @Override
        public Fragment getItem(int position) {
            switch (position){
                case 0:                       
                    return new FragmentA();
                case 1:
                    return new SettingsFragment();
                default:
                    return null;
            }
        }


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


}

【问题讨论】:

    标签: android android-fragments android-viewpager fragmentpageradapter pager


    【解决方案1】:

    ViewPager 自动标记片段,因此此处无法通过标记查找片段。但是,您可以通过覆盖FragmentPagerAdapter 类的instantiateItem(ViewGroup container, int position) 方法来保留对视图寻呼机创建的片段的引用。

       Fragment myFragment = null;
    
        public class PagerAdapter extends FragmentStatePagerAdapter {
            public PagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public Fragment getItem(int position) {
                switch (position){
                    case 0:                       
                        return new FragmentA();
                    case 1:
                        return new SettingsFragment();
                    default:
                        return null;
                }
            }
    
    
            @Override
            public int getCount() {
                return 2;
            }
    
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                myFragment = (Fragment) super.instantiateItem(container, position);
                if (myFragment != null) {
                    Log.i(TAG, "Fragment retrieved " + myFragment.toString());
                }
    
                return myFragment;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多