Есть два отдельных вопроса, которые я вижу здесь; (1) что такое элемент <fragment>
? (2) Я (что означает, что вы) делаете то, что я пытался сделать в своем предыдущем вопросе наилучшим образом, используя FrameLayout
?.
Я постараюсь ответить на оба.
XML-тег <fragment>
- это еще один способ реализации фрагмента. Как обновитель, Fragment
является частью деятельности. Это самостоятельный класс, однако, обращаясь к fragment documentation, потому что Fragment
предназначен для модульной работы, все фрагменты должны быть размещены в отдельном FragmentActivity
. Подумайте об этом как FragmentActivity
в качестве контейнера. Загружая Fragment
в FragmentActivity
, FragmentActivity
предоставляет другие ценные функции, к которым у класса Fragment
нет доступа к ним самостоятельно. Он также предлагает вам возможность динамически менять фрагменты, что позволяет использовать более гибкий пользовательский интерфейс.
Как вы загружаете Fragment
в его содержащий FragmentActivity
, зависит от того, что вы пытаетесь выполнить. Один из способов сделать это - использовать тег <fragment>
. При таком подходе вместо объявления Fragment
в Java-коде активности и затем загрузки его FragmentTransaction
, как и в предыдущем вопросе, класс Fragment
загружается через XML-макет для содержащего FragmentActivity
.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment
android:name="com.example.android.fragments.HeadlinesFragment"
android:id="@+id/headlines_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
Вы можете увидеть фрагмент, указанный здесь, в примере, взятом из андроидных документов. Затем фрагмент загружается FragmentActivty
, когда setContentView()
называется onCreate
.
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
}
}
Другой способ отображения фрагментов - как вы это делали в своем предыдущем примере. Используя FragmentManager
, вы можете создать новый экземпляр класса Fragment
и загрузить его программно в код Java.
Итак, какая техника имеет смысл, когда? В качестве примера из демонстраций docs для Android используется метод фрагмента XML, когда вы используете неподвижные фрагменты, т. Е. Вы не динамически меняете фрагменты внутри и снаружи. Это связано с тем, что вы не можете редактировать XML-макет, который вы создаете «на лету» так же, как и код Java. Кроме того, из того, что я могу сказать, использование XML-подхода относится к фрагментам, более похожим на элементы макета, выделяющие различные элементы управления. В примере для Android они используют XML-подход для отображения 2 фрагментов бок о бок на планшете. Контролируя фрагменты, более похожие на элементы компоновки, например.имея возможность настроить layout_weight
, вы можете добиться лучшего результата для этой цели.
Однако, если вы разрабатываете высокодинамичное UX, скажем, с ViewPager
или какой-либо другой функции, где фрагменты будут повернуты на регулярной основе, это имеет смысл использовать раздельные Fragment
классы и заменить эти Fragments
, поскольку они становятся необходимыми.
Основываясь на вашем предыдущем вопросе и необходимости динамического обмена фрагментами, я думаю, что вы сделали правильный выбор для этой реализации.
'FrameLayout' не связан с фрагментами, это единственная группа просмотра с одним ребенком. Пример, который вы видели, вероятно, использует «FrameLayout» как контейнер фрагмента, который позже может быть заменен другим. – tbruyelle