【问题标题】:Setting scroll flags using data binding in android在android中使用数据绑定设置滚动标志
【发布时间】:2019-08-08 07:10:09
【问题描述】:

我想使用数据绑定在折叠工具栏布局中设置滚动标志。这就是我想要实现的目标:

app:layout_scrollFlags="@{isListEmpty ? snap : scroll|exitUntilCollapsed|snap}"

但它给出了以下错误:

发现数据绑定错误。 ****/ 数据绑定错误 ****msg:标识符必须具有来自 XML 文件的用户定义类型。 snap 不见了

所以基本上我只想在列表为空时关闭折叠效果。我可以在代码中实现这一点,但如果有一种方法可以使用 xml 中的数据绑定来实现这一点,那将非常有帮助。

【问题讨论】:

  • 尝试为此提供 自定义 BindingAdapter 逻辑。
  • 哦,是的,按预期工作。谢谢。我仍然想知道这是否可以在不编写自定义绑定适配器的情况下实现。毕竟我们想要的只是根据某些条件设置滚动行为,所以什么时候不能在 xml 本身中完成。

标签: android android-databinding android-collapsingtoolbarlayout


【解决方案1】:

我使用 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数据标签中的变量。

【讨论】:

    【解决方案2】:

    您可以使用 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. xml 代码中的 if/else 语句是一种不好的做法(尽管您可以在 Android 文档中看到它,但这种做法是单一职责的细分 原则,因为视图根据布尔变量决定设置哪个标志)。

    将活动/片段端的标志设置为整数:

    if(isListEmpty) {
        viewModel.setFlags(snap) 
    } else {
        viewModel.setFlags(scroll|exitUntilCollapsed|snap)
    }
    

    因此,您不会保留任何“Android 相关”数据,例如视图模型中标志的引用。对于视图模型,它只是一个整数变量。

    希望对你有帮助)

    【讨论】:

    • 感谢您发布您的答案,我做了完全一样的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多