屏幕旋转的片段

我已经添加了一个viewpager到一个包含两个页面的活动。

在onCreate的活动中,我添加片段到fragmentAdapter:

public void onCreate(Bundle savedInstanceState) { ...... FragmentAdapter fragmentAdapter = new FragmentAdapter ( getSupportFragmentManager(), new Fragment[]{FragmentGame.builder(id), FragmentComments.builder(id)}, new String[]{getString(R.string.gameInfo), getString(R.string.comments)} ); ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager); viewPager.setAdapter(fragmentAdapter); public static FragmentGame builder(long id) { FragmentGame fragmentGame = new FragmentGame(); // fragmentGame.id = id; Bundle bundle = new Bundle(); bundle.putLong(Constants.EXTRA_ID, id); fragmentGame.setArguments(bundle); return fragmentGame; } 

第一次创build活动时,会按照预期的方式调用片段的onCreateView

奇怪的行为是当屏幕第一次旋转时,片段的onCreateView被调用了两次,但第二次调用只有正确的ID ,第一次调用ID为0。

在第二次屏幕旋转时, onCreateView被调用三次,只有最后一个有id。

通过更多的屏幕旋转, onCreateView调用增加。

我发现一些相关的问题关于片段和屏幕旋转,但我不明白为什么会发生这种情况,以及如何正确的方式做到这一点。

—–更新——

身份证问题解决了,因为我用直接值设置replace了包。

Solutions Collecting From Web of "屏幕旋转的片段"

每当你旋转你的设备,你正在创build一个新的片段,并将其添加到FragmentManager。

所有以前创build的片段仍然在FragmentManager中,因此计数每次增加1。

如果您希望在片段中保留一个值,则需要将其存储在参数中,否则在系统重新创build片段时,包含的任何值都将丢失。

 public static FragmentGame builder(long id) { Bundle args = new Bundle(); args.putInt("id", id); fragmentGame f = new fragmentGame(); f.setArguments(args); } 

而不是创build一个新的片段,我怀疑你真的想要旋转设备时检索以前创build的片段。 使用getSupportFragmentManager().findFragmentById()getSupportFragmentManager().findFragmentByTag()来做到这一点。

编辑:额外的代码

  // Add fragment to the manager FragmentTransaction trans=getSupportFragmentManager().beginTransaction(); trans.add(f,"myTag"); trans.commit(); // retrieve the fragment Fragment f= getSupportFragmentManager().findFragmentByTag("myTag"); 

只要尝试检索片段,如果值为null,则创build一个新片段并将其添加到pipe理器,否则使用检索到的片段。

如果您不想在方向更改中重新加载片段,请为您在清单文件中加载片段的活动编写以下内容。

 <activity android:name="your activity name" android:configChanges="orientation|screenSize" // add this to your activity android:label="@string/app_name"> </activity>