工具栏中的问题设置颜色(android-kotlin)

Posted

技术标签:

【中文标题】工具栏中的问题设置颜色(android-kotlin)【英文标题】:Problem setting color in toolbar (android-kotlin) 【发布时间】:2021-12-24 05:33:18 【问题描述】:

我的工具栏有问题。

我希望设备应用程序和工具栏颜色相同,但不要使用 findviewbyid。 (我正在迁移整个项目只是为了查看绑定 )

OK 行为(使用 findviewbyid)。

NOK 行为(使用视图绑定),导致 textView 稍微错位,它似乎收到了未放置的边距。

但是如果我在 onWindowsInsetsChanged 方法中声明不同或不使用它,我会遇到另一个问题,颜色不正确。

使用 findviewbyid:

 override fun onWindowsInsetsChanged(view: View, insets: WindowInsets, padding: InitialPadding) 
        with(binding) 
            val toolbar  = fragmentEditObjectiveNameRoot.findViewById<View>(R.id.toolbar)
            toolbar.updatePadding(top = topInset)

            editObjectiveNameRoot.updatePadding(
                bottom = insets.systemWindowInsetBottom
            )
        
    

使用视图绑定:

override fun onWindowsInsetsChanged(view: View, insets: WindowInsets, padding: InitialPadding) 
        with(binding) 
//calling the include toolbar and the root of the toolbar fragment

            toolbar.viewImageToolbar.updatePadding(
                top = topInset
            )

            editObjectiveNameRoot.updatePadding(
                bottom = insets.systemWindowInsetBottom
            )
        
    

onWindowsInsetsChanged 中的不同声明:

override fun onWindowsInsetsChanged(view: View, insets: WindowInsets, padding: InitialPadding) 
        with(binding) 
//calling root from fragment and instead of calling the include toolbar and its root

            fragmentEditObjectiveNameRoot.updatePadding(
                top = topInset
            )

            editObjectiveNameRoot.updatePadding(
                bottom = insets.systemWindowInsetBottom
            )
        
    

我想在使用 findviewbyid 时保留相同的颜色行为,但使用视图绑定,但不会丢失 textView 对齐。

这里是接收工具栏的xml包括:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/fragmentEditObjectiveNameRoot"
    android:layout_
    android:layout_
    android:fitsSystemWindows="true">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/editObjectiveNameRoot"
        android:layout_
        android:layout_
        android:orientation="vertical">

        <FrameLayout
            android:id="@+id/bgColorFrameLayout"
            android:layout_
            android:layout_
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/toolbar" />

        <androidx.core.widget.NestedScrollView
            android:id="@+id/scrollView"
            android:layout_
            android:layout_
            android:fillViewport="true"
            android:clipToPadding="false"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/toolbar">

            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_
                android:layout_
                android:layout_marginStart="@dimen/screen_margin_horizontal"
                android:layout_marginTop="18dp"
                android:layout_marginEnd="@dimen/screen_margin_horizontal"
                android:paddingBottom="16dp">

                <com.google.android.material.card.MaterialCardView
                    android:id="@+id/cardView"
                    android:layout_
                    android:layout_
                    app:cardBackgroundColor="@color/bari_white"
                    app:cardCornerRadius="@dimen/card_corner_radius"
                    app:cardElevation="0dp"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent">

                    <androidx.constraintlayout.widget.ConstraintLayout
                        android:layout_
                        android:layout_
                        android:padding="@dimen/card_padding">

                        <TextView
                            android:id="@+id/titleSubAccount"
                            android:layout_
                            android:layout_
                            android:gravity="center"
                            android:text="@string/sub_account_control_settings_edit_name"
                            android:textAlignment="center"
                            app:layout_constraintEnd_toEndOf="parent"
                            app:layout_constraintStart_toStartOf="parent"
                            app:layout_constraintTop_toTopOf="parent" />

                        <br.com.bancobari.core_ui.views.text_input.BariTextInputLayout
                            android:id="@+id/nameInputLayout"
                            android:layout_
                            android:layout_
                            android:layout_marginTop="32dp"
                            app:helperIconEnabled="true"
                            app:helperStart_enabled="true"
                            app:layout_constraintBottom_toBottomOf="parent"
                            app:layout_constraintEnd_toEndOf="parent"
                            app:layout_constraintStart_toStartOf="parent"
                            app:layout_constraintTop_toBottomOf="@id/titleSubAccount">

                            <br.com.bancobari.core_ui.views.text_input.BariTextInputEditText
                                android:id="@+id/nameEditText"
                                android:layout_
                                android:layout_
                                android:inputType="textPersonName|textCapWords"
                                android:maxLength="16"
                                android:textAlignment="center"
                                android:textSize="16sp" />

                        </br.com.bancobari.core_ui.views.text_input.BariTextInputLayout>

                    </androidx.constraintlayout.widget.ConstraintLayout>

                </com.google.android.material.card.MaterialCardView>

                <br.com.bancobari.core_ui.views.SubmitButton
                    android:id="@+id/saveButton"
                    style="@style/DefaultButton.Icon.Arrow"
                    android:layout_
                    android:layout_
                    android:layout_marginTop="18dp"
                    android:text="@string/objective_settings_save"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@id/cardView"
                    app:layout_constraintVertical_bias="1.0" />

            </androidx.constraintlayout.widget.ConstraintLayout>

        </androidx.core.widget.NestedScrollView>

        <include
            android:id="@+id/toolbar"
            layout="@layout/view_image_toolbar" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

这里是工具栏xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_>

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/viewImageToolbar"
        android:layout_
        android:layout_
        android:layout_gravity="center_horizontal"
        android:minHeight="@dimen/custom_toolbar_height"
        app:contentInsetLeft="0dp"
        app:contentInsetStart="0dp"
        app:contentInsetStartWithNavigation="0dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <View
            android:layout_
            android:layout_ />

    </androidx.appcompat.widget.Toolbar>

    <TextView
        android:id="@+id/iconEmojiView"
        android:layout_
        android:layout_
        android:layout_marginEnd="10dp"
        android:gravity="bottom"
        android:textSize="22.5sp"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="@id/toolbarTitleTextView"
        app:layout_constraintEnd_toStartOf="@+id/toolbarTitleTextView"
        tools:visibility="visible" />

    <TextView
        android:id="@+id/toolbarTitleTextView"
        android:layout_
        android:layout_
        android:layout_gravity="center"
        android:ellipsize="end"
        android:fontFamily="@font/nunito_bold"
        android:gravity="center"
        android:lines="1"
        android:textColor="@color/text_neutral_gray_800"
        android:textSize="18sp"
        app:layout_constraintBottom_toBottomOf="@id/viewImageToolbar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Teste" />

    <ImageView
        android:id="@+id/toolbarRightIconImageView"
        style="@style/Widget.AppCompat.ActionButton"
        android:layout_
        android:layout_
        android:src="@drawable/ic_settings"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="@id/toolbarTitleTextView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="@id/toolbarTitleTextView" />

</androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

在您的 findViewById 中,您正在搜索 ID 为 toolbar 的视图,但在您的视图绑定引用中,您使用的是 ID 为 viewImageToolbar 的视图,因此布局不同元素。 @Tenfour04 是的,在第一种情况下使用findViewById 我访问include toolbar ID,我可以访问updatePadding 方法,在第二种情况下如果我使用view binding 访问include toolbar ID,我不能使用我刚刚使用的updatePadding 方法,调用toolbar.viewImageToolbar 能够使用updatePadding 方法 【参考方案1】:

在你的第一个代码块findViewById,这个

val toolbar = fragmentEditObjectiveNameRoot.findViewById<View>(R.id.toolbar)

使用 ID 工具栏返回包含布局根目录的 ConstraintLayout。

绑定中的属性toolbar 是包含布局的另一个绑定,而不是该布局的根视图。在这种情况下,包含绑定的 root 属性与上面的 ConstraintLayout 相同,因此您应该改用:

toolbar.root.updatePadding(
    top = topInset
)

您所做的是更改完整工具栏布局的内部视图的填充,即viewImageToolbar 元素。

【讨论】:

天哪,我没想过使用这种形式的根,谢谢,你救了我的一天。

以上是关于工具栏中的问题设置颜色(android-kotlin)的主要内容,如果未能解决你的问题,请参考以下文章

更改工具栏中的标题颜色?

如何改变spyder高亮匹配的颜色

为啥网页的背景颜色都没有了

怎样设置VS2010 IDE窗口背景颜色

怎么将ubuntu终端工具的背景颜色设置为透明

PyCharm设置字体大小与颜色