11

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

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

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

资源/布局/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

4 回答 4

12

根据 Android 开发页面,在 Activity 的 onCreate 方法中,您应该在将片段添加到 Activity 之前检查 savedInstanceState 是否为空。此页面中 Activity 的 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;
}
于 2016-01-31T17:43:08.680 回答
6

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

而您想要实现的最佳实践是将 XML 文件放入您的 layout/ 文件夹中,其中仅使用您的 listfragment。在您的 layout-land/ 中,您放置了一个包含使用和排列的片段的 XML 文件。

然后系统处理所有的创建。碎片。你的活动基本上减少到一个 setContentView() 调用。

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

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

我知道 2 个很好的教程:android 开发者页面和 vogella.de 上的片段页面都将为您提供详细的示例/教程。

于 2012-02-20T23:50:55.633 回答
5

把FrameLayout换成LinerLayout,问题就解决了。

这是一个与 FrameLayout 相关的问题。

于 2013-12-18T03:50:59.153 回答
2

这对我有用。

public void onCreate(Bundle savedInstanceState) {

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

}
于 2012-07-12T10:03:46.993 回答