В настоящее время наиболее распространенным стилем домашней страницы приложения является нижняя вкладка + несколько фрагментов. Есть много способов записать его. Обычно вы пишете макет в макете, а затем выполняете обработку щелчков в Activity, переключаете стили, переключаете страницы и записываете события. Подождите минуту. Чтобы упростить эту операцию, был написан небольшой элемент управления для инкапсуляции вейвлета, а для обработки этого режима использовался файл конфигурации.
Как пользоваться
Очень просто, сначала добавьте макет в макет и используйте container_id, чтобы указать макет контейнера фрагмента.
<FrameLayout
android:id="@+id/flFragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/layoutBottomTab" />
<oms.mmc.tempapplication.HomeBottomTabLayout
android:id="@+id/layoutBottomTab"
android:layout_width="match_parent"
android:layout_height="58dp"
android:layout_alignParentBottom="true"
android:background="#e9e9e9"
app:container_id="@id/flFragmentContainer" />
Затем добавьте файл конфигурации в файл ресурсов tab.json
{
"tabs": [
{
"tabName": "黄历",
"tabTag": "key_almanac_fragment",
"iconNormal": "main_home_tab_huangli_normal",
"iconSelected": "main_home_tab_huangli_selected",
"textColorNormal": "#A4A3A3",
"textColorSelected": "#C02221"
},
{
"tabName": "工具",
"tabTag": "key_discover_fragment",
"iconNormal": "main_home_tab_tool_normal",
"iconSelected": "main_home_tab_tool_selected",
"textColorNormal": "#A4A3A3",
"textColorSelected": "#C02221"
},
{
"tabName": "福利",
"tabTag": "key_makemoney_money_fragment",
"iconNormal": "main_home_tab_money_normal",
"iconSelected": "main_home_tab_money_selected",
"textColorNormal": "#A4A3A3",
"textColorSelected": "#C02221"
}
]
}
Таким образом, вы можете инициализировать стиль домашней страницы tab + Fragment внизу. Как настроить Фрагмент?
Посмотрите на приведенное выше, мы добавили поле к каждой вкладке: tagTag. Правильно, на основе этого тега мы переходим к получению фрагмента.
Итак, третий шаг - реализовать интерфейс, определенный в элементе управления в Activity, и реализовать метод получения фрагмента. Здесь мы должны соответствовать один за другим в соответствии с ранее настроенными тегами.
@Override
public Fragment getFragmentByTag(@NotNull String tabTag) {
switch (tabTag) {
case TAG_HOME_ALMANAC:
return AlmanacService.getAlmanacFragment();
case TAG_HOME_CALENDAR:
return CalendarService.getCalendarFragment();
case TAG_HOME_TOOLS:
return DiscoverService.getDiscoverFragment();
case TAG_HOME_MONEY:
return MakeMoneyService.getMoneyFragment();
case TAG_HOME_USER_CENTER:
return UserService.getUserHomeMainFragment();
default:
return null;
}
}
Этот шаг в основном в порядке, и весь эффект и режим в порядке. Затем, если вам нужно выполнить некоторые другие специальные операции при переключении вкладок, что вы должны делать? Не волнуйтесь, если интерфейс открыт для внешнего использования, если вы реализуете этот метод onClickChangeTab()
, вы можете выполнять некоторые действия, такие как отчеты о событиях и изменение стилей.
Принцип реализации
Принцип очень прост. Фактически, это инкапсуляция. Все, что нужно написать в макете, и некоторые вещи, которые нужно оценить и обработать в действии, помещаются сюда для централизованной обработки, что удобно и грубо в использовании.
Шаг 1. Прочтите конфигурацию
Прочтите файл в утверждениях, прочтите его в потоке и преобразуйте в строку, а затем преобразуйте его в наш файл конфигурации на основе этой строки json.
Шаг 2. Создайте представление
Непосредственно генерируется кодом, изображение + текст, поровну разделенное по весу, устанавливает событие клика
Шаг 3. Нажмите, чтобы переключить вкладку
Здесь есть два шага: один - переключить стиль вкладки, а другой - переключить фрагмент. На что мы должны обратить внимание, так это на переключение фрагмента. Мы используем методы скрытия и отображения. Если добавление происходит впервые, используйте метод добавления. Вы не можете использовать метод замены для переключения, иначе фрагмент будет перестроен, и все жизненные циклы придется перезапускать. Еще раз.
private fun setFragmentSelected(selectedIndex: Int) {
val beginTransaction = mFragmentManager?.beginTransaction()
val tabConfig = mTabs?.get(selectedIndex)
var fragmentByTag = mFragmentManager?.findFragmentByTag(tabConfig?.tabTag)
val isFirstInit: Boolean
if (fragmentByTag == null) {
fragmentByTag = mCallback?.getFragmentByTag(tabConfig?.tabTag ?: "")
mFragmentList?.set(selectedIndex, fragmentByTag)
isFirstInit = true
} else {
isFirstInit = false
}
mFragmentList?.forEachIndexed { index, fragment ->
if (fragment != null && fragment.isAdded) {
beginTransaction?.hide(fragment)
}
}
if (isFirstInit) {
beginTransaction?.add(mFragmentContainerId, fragmentByTag!!, tabConfig?.tabTag)
} else {
beginTransaction?.show(fragmentByTag!!)
}
beginTransaction?.commit()
}
Шаг 4. Предоставьте извне несколько общих методов
Поскольку часто используются такие методы, как получение текущего фрагмента, текущего индекса и т. Д., Эти методы доступны извне. Поскольку список фрагментов, список представлений и текущий индекс поддерживаются, эти методы могут напрямую извлекать соответствующие значения.
Эффект
как сказать? Объем кода в Activity и layout намного меньше, и он относительно прост в использовании.В любом случае, я чувствую, что он очень ароматный.
Поскольку он читает файл конфигурации, чтобы установить макет, требуется время, чтобы взглянуть на него. Как правило, эти операции выполняются в течение 100 мс.