在 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 来完成。像那样:

  1. 添加绑定适配器:
@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
}

  1. 替换您 xml 中的代码:
    app:layout_scrollFlags="@{viewModel.flags}"
  1. 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的数据标签中的变量。