Я пытаюсь заставить мою контекстную панель действий или CAB вести себя Материальным способом , таким как перенос текста заголовка, когда он длинный. Для обычной панели инструментов я использую appCompat.Toolbar, но для CAB я использую appCompat.ActionMode, его атрибуты в основном ориентированы на стиль, но поскольку TextView по умолчанию ActionMode, по-видимому, не поддерживает перенос строк, а вместо этого - эллипсы и нет открытого метода для установки его обтекания, я пытаюсь найти решение для управления этим поведением с помощью стиля или программной установки его с помощью метода setCustomView в переопределении onCreateActionMode. Если я не найду способ сделать это, CAB может странно наложиться на панель инструментов, которая выполняет перенос.
Я пытался установить атрибуты в разных частях стиля, создать собственный макет текстового представления для заголовка CAB, установить его как в стиле, так и программно, используя customView, но, похоже, я не могу заставить что-либо работать.
Я создал пользовательский макет для использования в моих стилях или в ContextualActionBar.
context_action_mode_title_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/action_mode_title"
android:textColor="@color/warning"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:gravity="center_vertical"
android:ellipsize="none"
android:maxLines="2"/>
</LinearLayout>
В моем styles.xml :
<resources>
<style name="CommonAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="toolbarStyle">@style/Toolbar</item>
<item name="actionModeStyle">@style/CommonAppTheme.ContextActionBar</item>
<item name="actionBarTheme">@style/CommonAppTheme.ContextActionBar</item>
</style>
<style name="Toolbar" parent="Widget.AppCompat.Toolbar">
<item name="android:background">@color/surface</item>
<item name="android:textColor">@color/on_background</item>
<item name="android:titleTextColor">@color/on_background</item>
</style>
<style name="CommonAppTheme.ContextActionBar" parent="Widget.AppCompat.ActionMode">
<item name="background">@color/on_surface</item>
<item name="titleTextStyle">@style/CommonAppTheme.ContextualTextStyle</item>
<item name="tint">@color/surface</item>
<item name="android:displayOptions">showCustom</item>
<item name="android:customNavigationLayout">@layout/context_action_bar_title_layout</item>
</style>
<style name="CommonAppTheme.ContextualTextStyle">
<item name="android:textColor">@color/surface</item>
<item name="android:displayOptions">showCustom</item>
<item name="android:customNavigationLayout">@layout/context_action_bar_title_layout</item>
<item name="android:maxLines">2</item>
<item name="android:ellipsize">none</item>
</style>
My ContextualActionBar.kt компонент:
class ContextualActionBar : ActionMode.Callback {
var onActionItemClickListener: OnActionItemClickListener? = null
private var mode: ActionMode? = null
@MenuRes
private var menuResId: Int = 0
private var title: String? = null
private var subtitle: String? = null
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
this.mode = mode
mode?.menuInflater?.inflate(menuResId, menu)
mode?.title = title
mode?.subtitle = subtitle
return true
}
fun startActionMode(view: View,
@MenuRes menuResId: Int,
title: String? = null,
subtitle: String? = null) {
this.menuResId = menuResId
this.title = title
this.subtitle = subtitle
view.startActionMode(this)
}
Я создаю экземпляр этого в виртуальной машине моего фрагмента, затем на диске заполняю заголовок, подзаголовок и меню в классе фрагмента.
Это разделы, в которых я не был полностью уверен в синтаксисе раздувания моего пользовательского макета, который будет использоваться при установке значений во фрагменте в CAB.
Я ожидал, что смогу каким-то образом сказать «использовать этот пользовательский макет» и установить его с его режимами макета, такими как отсутствие эллипсов и переноса текста, до количества maxLines. Затем при установке заголовка на основе фрагмента к фрагменту CAB может обрабатывать длинные строки текста.