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();
....
}