工具栏中的问题设置颜色(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)的主要内容,如果未能解决你的问题,请参考以下文章