Android фрагменты перекрываются после поворота экрана

Это приложение является учебным упражнением для меня, используя фрагменты, среди прочего. Он имеет одно действие, которое управляет несколькими различными фрагментами. Первый-ListFragment (A), который показывает, когда приложение запускается и загружает элементы списка из курсора. Щелчок элемента списка уведомляет об операции по замене ListFragment на DetailFragment (B) для этого элемента. Если во время просмотра (B) я поворачиваю экран, я вижу (B) поверх (A), например это:

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

мое лучшее предположение, что это связано с уничтожением Android и воссозданием активности при изменении конфигурации. Мне интересно, какое самое чистое решение для этой проблемы. Некоторые фрагменты кода следуют, дайте мне знать, если есть что-то еще, что я должен опубликовать.

res / макет / главная.в 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 ответов


Это потому, что вы используете макет рамки в качестве контейнера. Это не будет перекрываться для других макетов.

и для того, что вы хотите достичь наилучшей практики, это сделать XML-файл в макет/ папку, где используется только ваш listfragment. В вашем макете-land / вы помещаете XML-файл с обоими фрагментами, используемыми и расположенными.

затем система обрабатывает все творение. фрагментарный. И ваша активность в основном сводится к вызову setContentView ().

на a щелкните элемент списка, затем проверьте с помощью диспетчера фрагментов, создан ли фрагмент сведений. Если он создан, вы вызываете общедоступную функцию в фрагменте сведений для установки данных.

Если он не создан, вы создаете намерение с новой деятельностью.

Я знаю 2 хороших учебника: страница фрагментов на странице разработчиков android и vogella.de оба дадут вам подробный пример / учебник.


в соответствии с Android dev страница, в методе onCreate действия вы должны проверить, является ли savedInstanceState null перед добавлением фрагмента к действию. Фрагмент кода метода 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;
}

измените FrameLayout для LinerLayout и проблема будет решена.

Это проблема, связанная с FrameLayout.


это работает для меня.

public void onCreate(Bundle savedInstanceState) {

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

}