Использование макета фрагмента
У моего 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