在 android 中使用数据绑定设置滚动标志
Setting scroll flags using data binding in android
我想使用数据绑定在折叠工具栏布局中设置滚动标志。这就是我想要实现的目标:
app:layout_scrollFlags="@{isListEmpty ? snap : scroll|exitUntilCollapsed|snap}"
但出现以下错误:
Found data binding errors.
****/ data binding error ****msg: Identifiers must have user defined types from the XML file. snap is missing it
所以基本上我只想在列表为空时关闭折叠效果。我可以在代码中实现这一点,但如果有一种方法可以使用 xml.
中的数据绑定来实现这一点,那将非常有帮助
您可以使用 BindingAdapter 来完成。像那样:
- 添加绑定适配器:
@BindingAdapter("app:layout_scrollFlags")
fun setLayoutScrollFlags(toolbar : Toolbar, flags : Int) {
//toolbar is your toolbar within an AppBarLayout
val params = toolbar.layoutParams as AppBarLayout.LayoutParams
params.setScrollFlags(flags);
toolbar.layoutParams = params
}
- 替换您 xml 中的代码:
app:layout_scrollFlags="@{viewModel.flags}"
- If/else 语句在 xml 代码中是一种不好的做法(尽管你可以在 Android 文档中看到它,这种做法是单一职责的分解
原则,因为视图根据布尔变量决定设置哪个标志。
将 activity/fragment 端的标志设置为整数:
if(isListEmpty) {
viewModel.setFlags(snap)
} else {
viewModel.setFlags(scroll|exitUntilCollapsed|snap)
}
因此您不会保留任何“Android 相关”数据,例如视图模型中标志的引用。对于视图模型,它将只是一个整数变量。
希望对您有所帮助)
我使用 BindingAdapters 实现了这一点。虽然我仍然想知道这是否只能通过 xml 实现,这样我们就不必使用任何自定义属性。
所以我添加了一个自定义属性
@BindingAdapter("set_scroll_flags")
public static void setCollapsingToolbarScroll(CollapsingToolbarLayout
collapsingToolbar, boolean isListEmpty) {
if(isListEmpty)
{
AppBarLayout.LayoutParams toolbarLayoutParams = (AppBarLayout.LayoutParams) collapsingToolbar.getLayoutParams();
toolbarLayoutParams.setScrollFlags(0);
collapsingToolbar.setLayoutParams(toolbarLayoutParams);
}
else
{
AppBarLayout.LayoutParams toolbarLayoutParams = (AppBarLayout.LayoutParams) collapsingToolbar.getLayoutParams();
toolbarLayoutParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
| AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED | AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP);
collapsingToolbar.setLayoutParams(toolbarLayoutParams);
}
}
上面的代码在列表为空时停止折叠效果,当列表不为空时它会根据您设置的滚动标志(我使用 EXIT_UNTIL_COLLAPSED、SNAP 和 SCROLL)运行。
然后在 xml 中,在 CollapsingToolbarLayout 中使用如下属性:
set_scroll="@{isListEmpty}"
其中'isListEmpty'可以是xml的数据标签中的变量。
我想使用数据绑定在折叠工具栏布局中设置滚动标志。这就是我想要实现的目标:
app:layout_scrollFlags="@{isListEmpty ? snap : scroll|exitUntilCollapsed|snap}"
但出现以下错误:
Found data binding errors. ****/ data binding error ****msg: Identifiers must have user defined types from the XML file. snap is missing it
所以基本上我只想在列表为空时关闭折叠效果。我可以在代码中实现这一点,但如果有一种方法可以使用 xml.
中的数据绑定来实现这一点,那将非常有帮助您可以使用 BindingAdapter 来完成。像那样:
- 添加绑定适配器:
@BindingAdapter("app:layout_scrollFlags")
fun setLayoutScrollFlags(toolbar : Toolbar, flags : Int) {
//toolbar is your toolbar within an AppBarLayout
val params = toolbar.layoutParams as AppBarLayout.LayoutParams
params.setScrollFlags(flags);
toolbar.layoutParams = params
}
- 替换您 xml 中的代码:
app:layout_scrollFlags="@{viewModel.flags}"
- If/else 语句在 xml 代码中是一种不好的做法(尽管你可以在 Android 文档中看到它,这种做法是单一职责的分解 原则,因为视图根据布尔变量决定设置哪个标志。
将 activity/fragment 端的标志设置为整数:
if(isListEmpty) {
viewModel.setFlags(snap)
} else {
viewModel.setFlags(scroll|exitUntilCollapsed|snap)
}
因此您不会保留任何“Android 相关”数据,例如视图模型中标志的引用。对于视图模型,它将只是一个整数变量。
希望对您有所帮助)
我使用 BindingAdapters 实现了这一点。虽然我仍然想知道这是否只能通过 xml 实现,这样我们就不必使用任何自定义属性。
所以我添加了一个自定义属性
@BindingAdapter("set_scroll_flags")
public static void setCollapsingToolbarScroll(CollapsingToolbarLayout
collapsingToolbar, boolean isListEmpty) {
if(isListEmpty)
{
AppBarLayout.LayoutParams toolbarLayoutParams = (AppBarLayout.LayoutParams) collapsingToolbar.getLayoutParams();
toolbarLayoutParams.setScrollFlags(0);
collapsingToolbar.setLayoutParams(toolbarLayoutParams);
}
else
{
AppBarLayout.LayoutParams toolbarLayoutParams = (AppBarLayout.LayoutParams) collapsingToolbar.getLayoutParams();
toolbarLayoutParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
| AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED | AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP);
collapsingToolbar.setLayoutParams(toolbarLayoutParams);
}
}
上面的代码在列表为空时停止折叠效果,当列表不为空时它会根据您设置的滚动标志(我使用 EXIT_UNTIL_COLLAPSED、SNAP 和 SCROLL)运行。
然后在 xml 中,在 CollapsingToolbarLayout 中使用如下属性:
set_scroll="@{isListEmpty}"
其中'isListEmpty'可以是xml的数据标签中的变量。