allprojects {
repositories {
maven {
url 'https://s01.oss.sonatype.org/content/repositories/releases/'
}
}
}
dependencies {
implementation('com.gitee.chinasoft_ohos:ChromeLikeTabSwitcher:1.0.1')
implementation('com.gitee.chinasoft_ohos:ChromeLikeTabSwitcher_ohos_util:1.0.0')
implementation('com.gitee.chinasoft_ohos:ChromeLikeTabSwitcher_java_util:1.0.0')
implementation('com.gitee.chinasoft_ohos:ChromeLikeTabSwitcher_materialviewlibrary:1.0.0')
...
}
Проект можно запустить непосредственно с SDK 6 и DevEco Studio 2.2 beta1. Если проект не запускается, удалите файлы .gradle, .idea, build, gradle, build.gradle, создайте новый проект в соответствии со своей версией и скопируйте соответствующие файлы нового проекта в корневую директорию.#### Инструкция по использованию
Переключатель вкладок библиотеки реализован как пользовательский вид TabSwitcher. Его можно объявить программно или добавить в активность или фрагмент через XML-ресурс. Ниже приведён пример XML-кода, показывающий, как добавить этот вид в XML-ресурс_layout. Обычно следует использовать атрибуты layout_width и layout_height для полноценного отображения переключателя вкладок match_parent. Кроме того, этот вид предоставляет различные пользовательские атрибуты для настройки его внешнего вида, что также видно на данном примере.
<?xml version="1.0" encoding="utf-8"?>
<de.mrapp.tabswitcher.colorUi.widget.ColorDirectionalLayout
ohos:id="$+id:root"
xmlns:ohos="http://schemas.huawei.com/res/ohos"
xmlns:app="http://schemas.huawei.com/apk/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical"
ohos:theme_prefix="main">
Пример создания экземпляра TabSwitcher программным образом представлен ниже. Для всех атрибутов XML, показанных выше, можно использовать соответствующие методы установки.
TabSwitcher tabSwitcher = new TabSwitcher(context);
tabSwitcher.showAddTabButton(createAddTabButtonListener());
tabSwitcher.setToolbarNavigationIcon(ResourceTable.Media_ic_plus_white_24dp, createAddTabListener());
```Каждая вкладка, содержащаяся в TabSwitcher, представляет собой экземпляр класса Tab. Ниже приведён пример Java-кода, демонстрирующий создание новой вкладки и её добавление в TabSwitcher. Вкладка может иметь свои собственные настройки, такие как иконка, цвет фона и цвет шрифта. Метод setParameters позволяет связать Bundle с конкретной вкладкой, который может содержать дополнительную информацию о ней. Реализация интерфейса Tab.Callback и использование метода addCallback позволяют наблюдать за изменениями свойств вкладки.```java
Tab tab = new Tab("Заголовок");
Bundle parameters = new Bundle();
tab.setIcon(ResourceTable.Media_ic_file_outline_18dp);
...
tab.setParameters(parameters);
Для указания внешнего вида вкладок в TabSwitcher
необходимо переопределить абстрактный класс TabSwitcherDecorator
и применить его к TabSwitcher
через метод setDecorator
. Этот подход часто используется для заполнения развивающегося паттерна ListView
, RecyclerView
и других аналогичных компонентов.
Методы onInflateView
и onShowTab
должны быть переопределены для управления отображением вкладок. Первый метод используется для расширения представлений, используемых вкладками, второй — для настройки внешнего вида расширенных представлений в зависимости от текущего состояния. Метод findComponentById
внутри декоратора может использоваться для ссылки на компоненты представления.
Если используются различные представления для разных вкладок, то также следует переопределить методы getViewTypeCount
и getViewType
. Первый метод возвращает общее количество различных типов представлений, которые могут быть расширены методом onInflateView
, второй — должен вернуть уникальное целое число, которое определяет тип представления для конкретной вкладки. Пример реализации этого класса представлен ниже:
public class CustomTabSwitcherDecorator extends TabSwitcherDecorator {
@Override
public int onGetViewTypeCount() {
return 2; // Например, два типа представлений
}
}
``````java
@Override
public int onGetViewType(int position) {
if (position % 2 == 0) {
return 0;
} else {
return 1;
}
}
class Decorator extends TabSwitcherDecorator {
@NonNull
@Override
public View onInflateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, int viewType) {
Component view;
if (viewType == 0) {
LogUtil.loge("=== onInflateView 0");
view = inflater.parse(ResourceTable.Layout_tab_text_view, parent, false);
} else if (viewType == 1) {
LogUtil.loge("=== onInflateView 1");
view = inflater.parse(ResourceTable.Layout_tab_edit_text, parent, false);
} else {
LogUtil.loge("=== onInflateView 2");
view = inflater.parse(ResourceTable.Layout_tab_list_view, parent, false);
}
Toolbar toolbar = (Toolbar) view.findComponentById(ResourceTable.Id_toolbar);
toolbar.inflateMenu(ResourceTable.Layout_tab);
toolbar.setOnMenuItemClickListener(tabSwitcher, createToolbarMenuListener());
TabSwitcher.setupWithToolbar(tabSwitcher, toolbar, createTabSwitcherButtonListener());
return view;
}
}
``````java
@Override
public void onShowTab(@NonNull Context context, @NonNull TabSwitcher tabSwitcher,
@NonNull View view, @NonNull Tab tab, int index, int viewType,
@Nullable Bundle savedInstanceState) {
Text textView = findComponentById(ResourceTable.Id_title);
textView.setText((String) tab.getTitle());
Toolbar toolbar = findComponentById(ResourceTable.Id_toolbar);
toolbar.addMenuClickListener();
toolbar.setVisibility(tabSwitcher.isSwitcherShown() ? Component.HIDE : Component.VISIBLE);
if (toolbar.getMenu() != null) {
String theme_name = getThemeValue("theme_name");
if ("dark".equals(theme_name)) {
toolbar.getMenu().setImageSrc(de.mrapp.tabswitcher.ResourceTable.Media_more_menu_white);
toolbar.setButtonColor(1, Color.WHITE);
} else {
toolbar.getMenu().setImageSrc(de.mrapp.tabswitcher.ResourceTable.Media_more_menu);
toolbar.setButtonColor(0.5f, Color.DKGRAY);
}
}
ColorUiUtil.changeTheme(view, getContext().getTheme());
if (viewType == 1) {
LogUtil.loge("=== onShowTab viewType -> 1");
TextField editText = findComponentById(ResourceTable.Id_edit);
if (savedInstanceState == null) {
editText.setText("");
}
}
}
``` editText.requestFocus();
} else if (viewType == 2 && state != null) {
LogUtil.loge("=== onShowTab viewType -> 2");
ListContainer listView = findComponentById(ResourceTable.Id_list);
state.loadItems(listView);
}
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getViewType(@NonNull Tab tab, int index) {
Bundle parameters = tab.getParameters();
return parameters != null ? parameters.getInt("view_type") : 0;
}
@Override
public void onSaveInstanceState(@NonNull View view, @NonNull Tab tab, int index,
int viewType, @NonNull Bundle outState) {
// Сохраняет текущее состояние вкладки в Bundle outState при необходимости
}
}
Для применения декоратора к `TabSwitcher`, метод `setDecorator` следует использовать следующим образом. В случае отсутствия установленного декоратора, будет немедленно выброшено исключение `IllegalStateException`, когда виджет должен быть видимым.
```java
tabSwitcher.setDecorator(new Decorator());
```
Чтобы наблюдать за состоянием `TabSwitcher`, можно реализовать слушатель `TabSwitcherListener`. Этот интерфейс предоставляет методы, которые вызываются при добавлении или удалении вкладок из `TabSwitcher`, а также при скрытии или показе `TabSwitcher` (только при использовании макета для смартфонов). Экземпляры типа `TabSwitcherListener` могут быть добавлены с помощью метода `addListener`.
Для наблюдения за событиями закрытия вкладок, можно использовать метод `addTabCloseListener` для добавления экземпляров интерфейса `TabCloseListener`.
##### Использование анимацииКласс `TabSwitcher` предоставляет различные методы для добавления или удаления одной или нескольких вкладок. При наличии видимого `TabSwitcher` добавление или удаление вкладок происходит с анимацией. Для использования пользовательской анимации можно передать экземпляр класса `Animation` в метод.
##### Анимация прокрутки
При использовании макета с мобильными устройствами `SwipeAnimation` по умолчанию используется для добавления или удаления вкладок. Это приводит к горизонтальному свайпу вкладок (или вертикальному свайпу при горизонтальной ориентации устройства). Указание значения enum `SwipeAnimation.SwipeDirection` позволяет указать, следует ли двигаться слева направо или справа налево (соответственно сверху вниз или снизу вверх при горизонтальной ориентации).
Пример кода ниже показывает, как использовать конструктор `SwipeAnimation`, чтобы создать экземпляр класса:
```java
Animation animation = new SwipeAnimation.Builder().setDuration(2000)
.setInterpolator(new LinearInterpolator()).setDirection(SwipeAnimation.SwipeDirection.LEFT)
.create();
```
### Инструментальная панель и менюПредоставляемый библиотекой `TabSwitcher` вид позволяет отображать инструментальную панель. По умолчанию,
панель инструментов всегда скрыта. Чтобы показать её, следует воспользоваться методом `showToolbars`.
Используя макет смартфона, панель инструментов будет отображена при активной вкладке или когда вкладка
переключателя не содержит никаких вкладок. При использовании макета планшета две панели инструментов будут
всегда отображены — одна слева от вкладок, другая справа. Для обращения к панелям инструментов можно использовать
метод `getToolbars`. Он возвращает массив, содержащий панели инструментов текущего макета.
При использовании макета смартфона массив `Toolbar` содержит одну панель; при использовании макета планшета
левая панель находится в индексе 0, а правая — в индексе 1.Класс `TabSwitcher` предоставляет несколько методов для установки заголовков, навигационных значков и меню панели инструментов. Метод `setToolbarTitle` позволяет установить заголовок. При использовании макета планшета заголовок применяется к левой панели инструментов. Метод `setToolbarNavigationIcon` позволяет указать навигационный значок панели инструментов и слушатель события клика по этому значку. При использовании макета планшета значок применяется к левой панели инструментов. Чтобы добавить меню в панель инструментов `TabSwitcher`, можно использовать метод `inflateToolbarMenu`. В дополнение к ID ресурса меню, которое должно быть применено, он также позволяет указать слушатель, который будет уведомлен при нажатии на элементы меню.
Для предоставления кнопки, аналогичной кнопкам в браузере Chrome, которая отображает общее количество активных вкладок и позволяет переключать видимость переключателя вкладок, библиотека предлагает класс `TabSwitcherButton`. Он реализует пользовательскую кнопку `ImageButton`, которая реализует интерфейс `TabSwitcherListener`, чтобы поддерживать актуальное число отображаемых вкладок. Внешний вид этой кнопки определяется классом `TabSwitcherDrawable`. Если `TabSwitcherButton` должен использоваться как часть меню панели инструментов, то его следует включить в ресурсы меню. Пример использования приведён ниже:Пример использования TabSwitcherDrawable:
```java
private void initImage() {
image = new Image(getContext());
}
```
```markdown
Ресурс res = конвертRes(контекст(), ResourceTable.Media_вкладка_переключатель_изображение_фон);
// Изображение, которое используется кнопкой с изображением.
drawable = new TabSwitcherDrawable(контекст(), res);
изображение.setИзображениеЭлемент(drawable);
StackLayout.LayoutConfig params = new LayoutConfig(StackLayout.LayoutConfig.MATCH_PARENT, StackLayout.LayoutConfig.MATCH_PARENT);
params.выравнивание = TextAlignment.CENTER;
addComponent(изображение, params);
}
```
Использование TabSwitcherButton:
```
TabSwitcherButton viewActions = new TabSwitcherButton(контекст());
DirectionalLayout.LayoutConfig params = new LayoutConfig();
int height = (int) PixelUtil.dp2px(DimensionUtil.parseDimension(контекст().getString(ResourceTable.String_вкладка_высота))));
params.height = height;
params.width = height;
addComponent(viewActions, params);
```
Чтобы зарегистрировать меню как слушатель для `TabSwitcherButton`, можно использовать статический метод `setupWithMenu` класса `TabSwitcher`. Этот метод автоматически внедряет все элементы в меню `Menu` и регистрирует каждый элемент как слушатель `TabSwitcherButton` для конкретного экземпляра `TabSwitcher`. В случае необходимости можно указать слушатель нажатия кнопок через `OnClickListener`.
Пример использования данного метода с любым меню представлен ниже:
``````java
TabSwitcher.setupWithMenu(tabSwitcher, menu, new OnClickListener() { /* ... */ });
```
Если требуется настроить меню, являющееся частью самого `TabSwitcher`, можно воспользоваться следующим вызовом метода:
```java
TabSwitcher.setupWithMenu(tabSwitcher, new OnClickListener() { /* ... */ });
```
##### Использование тем
По умолчанию библиотека использует светлую тему для `TabSwitcher`. Однако, библиотека также предоставляет заранее определённую тему для `TabSwitcher` с темной палитрой. Ниже приведены скриншоты, демонстрирующие внешний вид темной темы.

##### Отображение заполнителя при отсутствии данных
Класс `TabSwitcher` предоставляет метод `setEmptyView`, который позволяет указывать пользовательское представление, которое будет отображено, когда данные отсутствуют. Указываемое представление может быть показано или скрыто с помощью анимации плавного перехода. Можно указать продолжительность этих анимаций. Первый вариант использования метода `setEmptyView` заключается в указании экземпляра класса `ohos.agp.components.Component`:
```java
Component component = // ... inflate component
tabSwitcher.setEmptyView(component);
```
Или же метод `setEmptyView` может использоваться путём указания идентификатора ресурса для представления:
```java
tabSwitcher.setEmptyView(ResourceTable.Id_empty_view);
```
Пример заполнителя, который будет отображен при отсутствии данных, представлен на нижеприведенном скриншоте.
##### Заполнение
Метод `setPadding` класса `TabSwitcher` переопределяется для применения заполнения ко всем вкладкам и их родительским представлениям. Основная цель такого поведения — применение оконного заполнения при использовании полупрозрачного состояния и/или навигационной панели, как это продемонстрировано в примерах приложений данной библиотеки. Пример использования метода `OnApplyWindowInsetsListener` для применения оконного заполнения к представлению `TabSwitcher` представлен ниже. Он должен использоваться в методе `onCreate` активности.
```java
tabSwitcher.getComponentTreeObserver().addWindowBoundListener(
new ComponentTreeObserver.WindowBoundListener() {
@Override
public void onWindowBound() {
int left = main_root.getLeft();
int top = main_root.getTop();
int right = main_root.getRight();
int bottom = main_root.getBottom();
float touchableAreaTop = top;
}
});
```
### Тестовая информация
Код проверен CodeCheck, ошибок нет.
Код проверен CloudTest, ошибок нет.
Проверка безопасности от вирусов пройдена успешно.
Функционал текущей версии демо совпадает с функционалом исходного компонента.
### Версионирование
- 1.0.2
- Yöntem `setPadding` sınıfı `TabSwitcher` yeniden tanımlanır, tüm sekme ve onların üst düzey temsillerine doldurmayı uygulamak için. Bu davranışın temel amacı, yarı saydam durumunu ve/veya navigasyon panelini kullanırken pencere doldurmasını uygulamaktır, bu örneklerde gösterilmiştir. `TabSwitcher`'in pencere doldurmasını uygulamak için `OnApplyWindowInsetsListener` yöntemini kullanmanın bir örneği aşağıda verilmiştir. Bu kod, aktivitenizin `onCreate` metodunda kullanılmalıdır.
- 1.0.1
- 1.0.0
- 0.0.1-SNAPSHOT
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )