Автоматический выбор фрагмента в Android

#android #fragment

#Android #фрагмент

Вопрос:

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

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

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

Ответ №1:

Вы определяете различные макеты в зависимости от размеров экрана, а затем управляете взаимодействием между фрагментами в исходном коде. Таким образом, в случае master / detail у вас будет один макет, который обрабатывает таблицы, и другой макет, который обрабатывает телефоны. Android автоматически выберет файл макета для текущего устройства в зависимости от его размера. Чтобы увидеть пример, запустите новый проект в Eclipse, выберите master / detail, и он создаст простой проект точно так, как описано.

Следующее взято из http://developer.android.com/guide/practices/tablets-and-handsets.html

В зависимости от размера экрана система применяет разные main.xml файл макета:

res/layout/main.xml для мобильных телефонов:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- "Fragment A" -->
    <fragment class="com.example.android.TitlesFragment"
              android:id="@ id/list_frag"
              android:layout_width="match_parent"
              android:layout_height="match_parent"/> </FrameLayout>
  

res/layout-large/main.xml для таблеток:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="horizontal"   android:layout_width="match_parent" android:layout_height="match_parent"   android:id="@ id/frags">
    <!-- "Fragment A" -->   <fragment class="com.example.android.TitlesFragment"
            android:id="@ id/list_frag"
            android:layout_width="@dimen/titles_size"
            android:layout_height="match_parent"/>
    <!-- "Fragment B" -->   <fragment class="com.example.android.DetailsFragment"
            android:id="@ id/details_frag"
            android:layout_width="match_parent"
            android:layout_height="match_parent" /> </LinearLayout>
  

Ответ №2:

Итак, вот как это работает

У вас есть контейнер в вашем файле макета действия, и каждый раз, когда вы добавляете / заменяете фрагмент, вы добавляете его в этот контейнер.

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

Больше ссылок отсюда Android Fragments

Комментарии:

1. Да, я это понимаю, но вы хотите сказать, что я должен вручную проверить текущий размер экрана и загрузить правильный макет фрагмента? В конце концов, Android имеет встроенное определение размера экрана и соответственно выбирает ресурсы. Так почему бы им также автоматически не выбрать правильный макет фрагмента?

2. @AndroidDev Нет, Android делает это за вас. Для строк существует String.xml файл в папке Values, однако вы можете создать место в папке values-lt Strings.xml там и переведите все на литовский, в таком случае, и Android автоматически загрузит литовский String.xml файл, когда он обнаруживает литовский системный язык. Это очень похоже на размеры экрана и макеты, хотя я еще не имел удовольствия делать это так много. Подробнее читайте здесь