自定义 Android XML 布局字段 contentInsetStartWithNavigation
Customising Androids XML Layout Field contentInsetStartWithNavigation
我将带有工具栏的 AppBarLayout 放在一个单独的文件中,并将其包含在我的 activity 布局中。在某些屏幕上,布局需要在字段 contentInsetStart
和 contentInsetStartWithNavigation
.
上具有不同的尺寸
字段 contentInsetStart
和 contentInsetStartWithNavigation
甚至都没有构建。
我如何包含 AppBar 并设置自定义属性
<include
android:id="@+id/include_app_bar_layout"
layout="@layout/view_app_bar_layout"
app:toolbarTitle="@{@string/custom_title}"
app:toolbarContentInsetStart="@{@dimen/customInsetStart}"
app:toolbarCISWN="@{@dimen/customInsetStartWithNavigation}"/>
属性为dp值
<dimen name="customInsetStart">92dp</dimen>
<dimen name="customInsetStartWithNavigation">92dp</dimen>
带有工具栏和一些变量的 AppBarLayout
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="toolbarTitle"
type="String" />
<variable
name="toolbarContentInsetStart"
type="java.lang.Float" />
<variable
name="toolbarCISWN"
type="Integer" />
<variable
name="appBarLayoutElevation"
type="java.lang.Float" />
<variable
name="appBarLayoutBackground"
type="Integer" />
</data>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
android:background="@{appBarLayoutBackground}"
app:elevation="@{appBarLayoutElevation}"
tools:ignore="RtlHardcoded,RtlSymmetry">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:theme="@style/ThemeOverlay.MyStyle.Toolbar"
app:title="@{toolbarTitle}"
app:contentInsetStart="@{toolbarContentInsetStart}"
app:contentInsetStartWithNavigation="@{toolbarCISWN}"
/>
</com.google.android.material.appbar.AppBarLayout>
</layout>
问题
如果我像上面那样将变量 toolbarCISWN
定义为 Integer
,那么我会得到一个构建错误
Cannot find setter for MyActivityLayoutFileBinding app:toolbarContentInsetStartWithNavigation that accepts parameter type 'float'.
如果我将变量类型设置为 Float
或 java.lang.Float
(如海拔变量),那么我会在 xml 文件中收到错误消息,即 app:contentInsetStartWithNavigation
不是类型为 Float
Cannot find a setter for androidx.appcompat.widget.Toolbar app:contentInsetStartWithNavigation that accepts parameter type 'java.lang.Float'
我的解决方案是将 AppBarLayout 设为自定义视图 class。然后,我从 xml 中删除了所有变量,并在 attr.xml 文件中创建了自定义属性。现在我可以完全控制“主机”xml。我现在不“包含”布局文件,而只是在“主机”xml 中使用自定义视图,例如 TextView。对于其他功能,我添加了绑定适配器。
我将带有工具栏的 AppBarLayout 放在一个单独的文件中,并将其包含在我的 activity 布局中。在某些屏幕上,布局需要在字段 contentInsetStart
和 contentInsetStartWithNavigation
.
字段 contentInsetStart
和 contentInsetStartWithNavigation
甚至都没有构建。
我如何包含 AppBar 并设置自定义属性
<include
android:id="@+id/include_app_bar_layout"
layout="@layout/view_app_bar_layout"
app:toolbarTitle="@{@string/custom_title}"
app:toolbarContentInsetStart="@{@dimen/customInsetStart}"
app:toolbarCISWN="@{@dimen/customInsetStartWithNavigation}"/>
属性为dp值
<dimen name="customInsetStart">92dp</dimen>
<dimen name="customInsetStartWithNavigation">92dp</dimen>
带有工具栏和一些变量的 AppBarLayout
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<variable
name="toolbarTitle"
type="String" />
<variable
name="toolbarContentInsetStart"
type="java.lang.Float" />
<variable
name="toolbarCISWN"
type="Integer" />
<variable
name="appBarLayoutElevation"
type="java.lang.Float" />
<variable
name="appBarLayoutBackground"
type="Integer" />
</data>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
android:background="@{appBarLayoutBackground}"
app:elevation="@{appBarLayoutElevation}"
tools:ignore="RtlHardcoded,RtlSymmetry">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:theme="@style/ThemeOverlay.MyStyle.Toolbar"
app:title="@{toolbarTitle}"
app:contentInsetStart="@{toolbarContentInsetStart}"
app:contentInsetStartWithNavigation="@{toolbarCISWN}"
/>
</com.google.android.material.appbar.AppBarLayout>
</layout>
问题
如果我像上面那样将变量 toolbarCISWN
定义为 Integer
,那么我会得到一个构建错误
Cannot find setter for MyActivityLayoutFileBinding app:toolbarContentInsetStartWithNavigation that accepts parameter type 'float'.
如果我将变量类型设置为 Float
或 java.lang.Float
(如海拔变量),那么我会在 xml 文件中收到错误消息,即 app:contentInsetStartWithNavigation
不是类型为 Float
Cannot find a setter for androidx.appcompat.widget.Toolbar app:contentInsetStartWithNavigation that accepts parameter type 'java.lang.Float'
我的解决方案是将 AppBarLayout 设为自定义视图 class。然后,我从 xml 中删除了所有变量,并在 attr.xml 文件中创建了自定义属性。现在我可以完全控制“主机”xml。我现在不“包含”布局文件,而只是在“主机”xml 中使用自定义视图,例如 TextView。对于其他功能,我添加了绑定适配器。