如果不需要,防止 CollapsingToolbarLayout 折叠

Posted

技术标签:

【中文标题】如果不需要,防止 CollapsingToolbarLayout 折叠【英文标题】:Prevent CollapsingToolbarLayout collapse if not needed 【发布时间】:2015-11-24 03:02:01 【问题描述】:

使用:

compile 'com.android.support:design:23.0.0'
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.android.support:cardview-v7:23.0.0'
compile 'com.android.support:recyclerview-v7:23.0.0'

随着项目Cheesesquare 的更新。

在奶酪的细节中,我删除了 2 张卡片(只有一张)。有没有办法防止显示空白的工具栏折叠?

【问题讨论】:

我并没有真正找到解决方案,但是我现在使用github.com/henrytao-me/smooth-app-bar-layout 并且我没有这个问题(因为实现方式不同) 你做了什么? 这就是你需要的custom scrolling view behavior 【参考方案1】:

要在Cheesesquare 示例中实现这种行为,只需将NestedScrollView 的android:layout_height 参数修改为wrap_content。 如果它足够小以适合屏幕,它将阻止按内容滚动。

为了防止滚动CollapsingToolbarLayout,您应该以编程方式将layout_scrollFlags 参数设置为AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP 值。

Here 描述了如何做到这一点。

【讨论】:

或者在xml中添加app:layout_scrollFlags="snap" 到CollapsingToolbarLayout标签 那么嵌套滚动视图很好但是折叠工具栏仍然可以滚动 layout_scrollFlags 不起作用。使用此解决方法禁用 CollapsingToolbarLayout 滚动。 ***.com/a/40750707/3094065 这是真的方法,真的有效! )【参考方案2】:

您可以使用以下代码:

   public static void stopScroll() 
    AppBarLayout.LayoutParams toolbarLayoutParams = (AppBarLayout.LayoutParams) collapsing_toolbar.getLayoutParams();
    toolbarLayoutParams.setScrollFlags(0);
    collapsing_toolbar.setLayoutParams(toolbarLayoutParams);

    CoordinatorLayout.LayoutParams appBarLayoutParams = (CoordinatorLayout.LayoutParams) appbar.getLayoutParams();
    appBarLayoutParams.setBehavior(null);
    appbar.setLayoutParams(appBarLayoutParams);


public static void startScroll() 
    AppBarLayout.LayoutParams toolbarLayoutParams = (AppBarLayout.LayoutParams) collapsing_toolbar.getLayoutParams();
    toolbarLayoutParams.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
    collapsing_toolbar.setLayoutParams(toolbarLayoutParams);

    CoordinatorLayout.LayoutParams appBarLayoutParams = (CoordinatorLayout.LayoutParams) appbar.getLayoutParams();
    appBarLayoutParams.setBehavior(new AppBarLayout.Behavior());
    appbar.setLayoutParams(appBarLayoutParams);

【讨论】:

随心所欲地为我工作!【参考方案3】:

在xml中我使用了属性

app:layout_scrollFlags="snap"<android.support.design.widget.CollapsingToolbarLayout

并在活动中关注

 toolbar = (Toolbar) findViewById(R.id.toolbar);
 setSupportActionBar(toolbar);
 toolbar.setTitle(null);
 toolbar.setCollapsible(false);

它现在正在工作。

【讨论】:

【参考方案4】:

受@Vishal 回答启发的数据绑定解决方案

    <com.google.android.material.appbar.AppBarLayout>
        <com.google.android.material.appbar.CollapsingToolbarLayout
            app:enableCollapsingScroll="@listItems.size > 0"
            ... />
    </com.google.android.material.appbar.AppBarLayout>
    @BindingAdapter("app:enableCollapsingScroll")
    fun setCollapsingToolbarLayoutScrollEnabled(collapsingToolbarLayout: CollapsingToolbarLayout, enabled: Boolean?) 
        val lp = collapsingToolbarLayout.layoutParams as AppBarLayout.LayoutParams
        if (enabled.orFalse()) 
            lp.scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL or AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED
         else 
            lp.scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP
        
        collapsingToolbarLayout.layoutParams = lp
    

【讨论】:

【参考方案5】:

这是我的工作代码,最初折叠栏:

_appbar.setExpanded(false);

   AppBarLayout _appbar = (AppBarLayout) findViewById(R.id.appbar);
    _appbar.setExpanded(false);

这里是布局xml

 <android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_
    android:layout_
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_
        android:layout_
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginStart="48dp"
        app:expandedTitleMarginEnd="64dp">



        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_
            android:layout_
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"

            app:layout_collapseMode="pin" />





    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

参考是:AppBarLayout.setExpanded(boolean)

【讨论】:

问题是如何防止倒塌【参考方案6】:
  AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) activityUserGroupProfleBinding.collapsingToolbarLayout.getLayoutParams();
        if (logic) 
            params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED);
         else 
            params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP);
        
        activityUserGroupProfleBinding.collapsingToolbarLayout.setLayoutParams(params);

【讨论】:

以上是关于如果不需要,防止 CollapsingToolbarLayout 折叠的主要内容,如果未能解决你的问题,请参考以下文章

什么是CC攻击,如何防止网站被CC攻击?

防止 C++ 中的意外对象复制

uniapp 防止重复点击

防止背景重复[重复]

如何防止健康检查请求在我的数据库中存储不需要的会话?

利用session防止用户未经登录而直接访问