Использование макета фрагмента

У моего Android-приложения есть требование, когда определенный поток имеет 7 разных экранов. Теперь у каждого из этих экранов есть общие верх и низ. Поэтому я решил создать FragmentActivity и 7 разных Fragments, Как мне вставить фрагменты в FragmentActivity во время выполнения? Я прочитал этот урок здесь, и в соответствии с этим уроком мой основной FragmentActivity должен иметь следующий макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <FrameLayout
        android:id="@+id/fragment_content"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>

И он должен использовать следующий код для замены фрагмента:

 FragmentManager fm = getSupportFragmentManager();
 Fragment fragment = fm.findFragmentById(R.id.fragment_content); 

 if (fragment == null) {
     FragmentTransaction ft = fm.beginTransaction();
     ft.add(R.id.fragment_content, new BasicFragment());
     ft.commit();
 }

Что я не понимаю, так это следующая строка:

 ft.add(R.id.fragment_content, new BasicFragment());

R.id.fragment_content это FrameLayoutвставит ли этот фрагмент в FrameLayout или что?

2 ответа

R.id.fragment_content - это FrameLayout? это вставит фрагмент в структуру кадра или что?

Из того, что я помню, фрагмент Fragment находится поверх него. Под ним есть еще один макет, который представляет собой "наклейку", прикрепляющую его к макету контейнера. Так что это торт в некотором роде. Чтобы заполучить эту "наклейку", я думаю, вы можете позвонить .getParent() на корневой вид фрагмента.

Да, и пометить фрагменты, чтобы легко найти их через FragmentManager(хотя поиск тегов немного дороже).

Вы можете посмотреть на это, как будто у вас есть бассейн (ваш FrameLayout в этом случае), в который вы можете бросить игрушечные корабли Fragments). Таким образом, в основном вам нужна среда, чтобы содержать вас Fragments и это может быть любой макет, который вы выберете.

Итак, что вы делаете здесь:

Fragment fragment = fm.findFragmentById(R.id.fragment_content); 

неправильно, потому что R.id.fragment_content это не Fragment но FrameLayout,

но это может быть вашим Fragment контейнер, поэтому вам нужно создать класс, который extends Fragment с его собственным макетом и сделайте операцию, которую вы сделали здесь:

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment_content, new BasicFragment(), tag);  //add a tag to a fragment during the transaction so you could easily retrieve it later.
ft.commit();

и, конечно, вы могли бы гораздо больше понять фрагменты, прочитав эту страницу:

http://developer.android.com/guide/components/fragments.html