Ali*_*Ali 8 android android-fragments
我已经将viewpager添加到包含两个页面的活动中.
在onCreate of activity中,我将片段添加到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;
}
Run Code Online (Sandbox Code Playgroud)
第一次创建活动时,片段的onCreateView会按预期调用.
奇怪的行为是当屏幕第一次旋转时,onCreateView of fragment被调用两次,但第二次调用只有正确的id,而第一次调用id为0.
在第二个屏幕旋转时,onCreateView被调用三次,并且只有最后一个具有id.
通过更多屏幕旋转,onCreateView调用增加.
我发现了一些关于片段和屏幕旋转的相关问题,但我无法弄清楚为什么会发生这种情况以及如何以正确的方式进行.
-----更新------
当我用直接值设置替换bundle时,ID问题得以解决.
kap*_*ani 14
如果您不想在方向更改时重新加载片段,请在清单文件中为要加载片段的活动编写以下内容.
<activity
android:name="your activity name"
android:configChanges="orientation|screenSize" // add this to your activity
android:label="@string/app_name">
</activity>
Run Code Online (Sandbox Code Playgroud)
每次旋转设备时,都会创建一个新片段并将其添加到FragmentManager中.
您之前创建的所有片段仍在FragmentManager中,因此每次计数增加1.
如果您希望在片段中保留一个值,则需要将其存储在参数中,否则当系统重新创建片段时,它包含的任何值都将丢失.
public static FragmentGame builder(long id) {
Bundle args = new Bundle();
args.putInt("id", id);
fragmentGame f = new fragmentGame();
f.setArguments(args);
}
Run Code Online (Sandbox Code Playgroud)
而不是创建一个新片段,我怀疑你真的想要在旋转设备时检索以前创建的片段.使用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");
Run Code Online (Sandbox Code Playgroud)
只是尝试检索片段,如果值为null,则创建一个新片段并将其添加到管理器,否则使用检索到的片段.
| 归档时间: |
|
| 查看次数: |
11861 次 |
| 最近记录: |