Обтекание текста заголовка в режиме действия с использованием пользовательского макета - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь заставить мою контекстную панель действий или 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 может обрабатывать длинные строки текста.

...