Я пишу приложение для планшетов 4.0 и 4.1, для которых я не хочу использовать вспомогательные библиотеки (если они не нужны), а только поэтому API 4.x.
Итак, моя целевая платформа очень хорошо определена как:> = 4.0 и <= 4.1.
Приложение имеет многопанельный макет (два фрагмента, один маленький слева, один фрагмент содержимого справа) и панель действий с вкладками.
Подобно этому:
Щелчок по вкладке на панели действий изменяет «внешний» фрагмент, а внутренний фрагмент становится фрагментом с двумя вложенными фрагментами (1. маленький фрагмент левого списка, 2. фрагмент с широким содержимым).
Теперь мне интересно, как лучше всего заменить фрагменты и особенно вложенные фрагменты. ViewPager является частью библиотеки поддержки, для этого класса нет собственной альтернативы 4.x. В моем понимании это кажется «устаревшим». - http://developer.android.com/reference/android/support/v4/view/ViewPager.html.
Затем я прочитал примечания к выпуску Android 4.2 относительно того ChildFragmentManager
, что было бы хорошо, но я ориентируюсь на 4.0 и 4.1, так что это тоже нельзя использовать.
ChildFragmentManager
доступно только в версии 4.2
- http://developer.android.com/about/versions/android-4.2.html#NestedFragments
- http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager ()
К сожалению, даже во всех руководствах для разработчиков Android почти нет хороших примеров, демонстрирующих передовые методы использования фрагментов без библиотеки поддержки; и особенно ничего о вложенных фрагментах.
Поэтому мне интересно: просто ли невозможно писать приложения 4.1 с вложенными фрагментами без использования библиотеки поддержки и всего, что с ней связано? (нужно использовать FragmentActivity вместо Fragment и т. д.?) Или что было бы лучше всего?
Проблема, с которой я сейчас сталкиваюсь в разработке, заключается в следующем:
Библиотека поддержки Android теперь также поддерживает вложенные фрагменты, поэтому вы можете реализовать дизайн вложенных фрагментов на Android 1.6 и выше.
Примечание. Вы не можете преобразовать макет во фрагмент, если этот макет содержит файл
<fragment>
. Вложенные фрагменты поддерживаются только при динамическом добавлении к фрагменту.
Поскольку я помещаю определение вложенных фрагментов в XML, что, по-видимому, вызывает ошибку, например:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_
На данный момент я делаю для себя вывод: даже на 4.1, когда я даже не хочу ориентироваться на платформу 2.x, вложенные фрагменты, как показано на скриншоте, невозможны без библиотеки поддержки.
(На самом деле это может быть больше вики-статья, чем вопрос, но, возможно, кто-то еще справился с этим раньше).
Обновить:
Полезный ответ: Фрагмент внутри фрагмента
ActionBar
(встроенной компанией Samsung). Присмотритесь к ActionBarSherlock, у него есть вкладки в ActionBar, если есть место.Ответы:
Ограничения
Таким образом, вложение фрагментов внутри другого фрагмента невозможно с xml независимо от того, какую версию
FragmentManager
вы используете.Таким образом, вы должны добавлять фрагменты через код, это может показаться проблемой, но в конечном итоге делает ваши макеты сверхгибкими.
Итак, вложение без использования
getChildFragmentManger
? Суть вchildFragmentManager
том, что он откладывает загрузку до завершения предыдущей транзакции фрагмента. И, конечно же, это естественно поддерживалось только в версии 4.2 или в библиотеке поддержки.Вложение без ChildManager - Решение
Решение, конечно! Я этим давно занимаюсь (с тех пор, как
ViewPager
был анонсирован).Увидеть ниже; Это
Fragment
откладывает загрузку, поэтому в негоFragment
можно загрузить s.Это довольно просто,
Handler
это действительно действительно удобный класс, фактически обработчик ожидает, пока пространство для выполнения в основном потоке после того, как текущая транзакция фрагмента завершит фиксацию (поскольку фрагменты мешают пользовательскому интерфейсу, который они запускают в основном потоке).Я бы не стал считать это «лучшей практикой», но у меня есть живые приложения, использующие этот хак, и у меня пока нет никаких проблем с ним.
Я также использую этот метод для встраивания пейджеров представлений - https://gist.github.com/chrisjenx/3405429
источник
fragment
элемент, вы переопределите супер-реализацию и попытаетесь самостоятельно разобрать / раздуть его. Но это потребует ОЧЕНЬ больших усилий, что выходит за рамки вопроса StackOverflow.Лучший способ сделать это в версиях до API 17 - не делать этого вообще. Попытка реализовать такое поведение вызовет проблемы. Однако это не означает, что его нельзя убедительно подделать с использованием текущего API 14. Я сделал следующее:
1 - посмотрите на связь между фрагментами http://developer.android.com/training/basics/fragments/communicating.html
2 - переместите макет xml FrameLayout из существующего фрагмента в макет Activity и скройте его, указав высоту 0:
3 - Реализуйте интерфейс в родительском фрагменте
4 - Реализуйте интерфейс в родительском Activity
открытый класс YourActivity extends Activity реализует yourParentFragment.OnListener {
}
5 - Наслаждайтесь, с помощью этого метода вы получаете ту же гибкую функциональность, что и с функцией getChildFragmentManager () в среде до API 17. Как вы, возможно, заметили, дочерний фрагмент больше не является дочерним по отношению к родительскому фрагменту, а теперь является дочерним по отношению к активности, этого действительно нельзя избежать.
источник
Мне пришлось столкнуться с этой конкретной проблемой из-за комбинации NavigationDrawer, TabHost и ViewPager, у которой были сложности с использованием библиотеки поддержки из-за TabHost. Кроме того, мне пришлось поддерживать минимальный API JellyBean 4.1, поэтому использование вложенных фрагментов с getChildFragmentManager было невозможным.
Так что мою проблему можно свести к ...
Мое решение состояло в том, чтобы создать иллюзию вложенных фрагментов без фактического вложения фрагментов. Я сделал это, заставив основное действие использовать TabHost И ViewPager для управления двумя одноуровневыми представлениями, видимость которых регулируется переключением layout_weight между 0 и 1.
Это эффективно позволяло моему поддельному «вложенному фрагменту» работать как независимое представление, пока я вручную управлял соответствующими весами макета.
Вот мой файл activity_main.xml:
Обратите внимание, что «@ + id / pager» и «@ + id / container» являются братьями и сестрами с 'android: layout_weight = "0.5"' и 'android: layout_height = "0dp"'. Это для того, чтобы я мог видеть это в превью при любом размере экрана. В любом случае их веса будут обрабатываться в коде во время выполнения.
источник
SO
что использованиеActionBar
вкладок с символом aNavigation Drawer
не очень хорошо, потому что оно автоматически помещает вкладки поверх вида вашего ящика. Извините, у меня нет ссылки для подтверждения.Основываясь на ответе @ Chris.Jenkins, это решение, которое хорошо работает для меня, для удаления фрагментов во время событий жизненного цикла (которые имеют тенденцию вызывать исключения IllegalStateExceptions). При этом используется комбинация подхода Handler и проверки Activity.isFinishing () (в противном случае будет выдана ошибка «Невозможно выполнить это действие после onSaveInstanceState»).
Использование:
источник
Хотя у OP могут быть особые обстоятельства, которые не позволяют ему использовать библиотеку поддержки, большинству людей следует ее использовать. Документация Android рекомендует это, и это сделает ваше приложение доступным для самой широкой аудитории.
В моем более полном ответе я привел пример, демонстрирующий, как использовать вложенные фрагменты с библиотекой поддержки.
источник