屏幕旋转后Android片段重叠

时间:2012-02-20 23:24:46

标签: android fragment overlapping screen-rotation

这个应用程序对我来说是一个学习练习,使用片段等等。它有一个活动来管理一些不同的片段。第一个是ListFragment(A),它显示应用程序何时启动并从游标加载列表项。单击列表项会通知活动将ListFragment替换为该项目的DetailFragment(B)。如果在看(B)的同时旋转屏幕,我会看到(B)在(A)之上,如下所示:

http://postimage.org/image/uhy016ds7/

我最好的猜测是它与Android销毁和重新创建配置更改活动有关。我想知道什么是这个问题最干净的解决方案。下面是一些代码片段,请告诉我是否应该发布其他内容。

RES /布局/ home.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <fragment
        android:id="@+id/fragment_place_list"
        android:name="com.simbiosys.apps.foodfast.ui.PlaceListFragment"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </fragment>
</FrameLayout>

MyActivity.onCreate

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home);

    placeListFragment = (PlaceListFragment) getSupportFragmentManager().findFragmentById(
            R.id.fragment_place_list);

}

MyActivity.showDetailPane

public void showDetailPane(String id, String reference) {
    placeDetailFragment = PlaceDetailFragment.newInstance(id, reference);
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.addToBackStack(null);
    ft.hide(placeListFragment);
    ft.replace(R.id.fragment_container, placeDetailFragment);
    ft.show(placeDetailFragment);
    ft.commit();
}

4 个答案:

答案 0 :(得分:9)

根据Android dev page,在Activity的onCreate方法中,您应该在将片段添加到活动之前检查savedInstanceState是否为null。来自this page的onCreate方法的代码片段表示。

// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
// we could end up with overlapping fragments.
if (savedInstanceState != null) {
     return;
}

答案 1 :(得分:5)

这是因为您使用框架布局作为容器。 它不会与其他布局重叠。

对于您希望实现最佳实践的目的是在您的布局/文件夹中创建一个XML文件,其中仅使用您的listfragment。 在你的layout-land /中你放了一个XML文件,其中包含使用和排列的两个片段。

然后系统处理所有的创建。片段。并且您的活动基本上减少为setContentView()调用。

在列表项上单击,然后检查片段管理器是否创建了详细信息片段。如果已创建,则在详细信息片段中调用公共函数来设置数据。

如果未创建,则使用新活动创建意图。

我知道2个很好的教程:android开发者页面上的片段页面和vogella.de都会给你一个详细的例子/教程。

答案 2 :(得分:3)

更改LinearLayout的FrameLayout,问题将解决。

这是与FrameLayout相关的问题。

答案 3 :(得分:2)

这适合我。

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    ....
    fragment = getFragmentManager().findFragmentByTag(TAG);
    if(fragment == null) fragment = new Fragment();
    ....

}