如何锁定来自Android支持库的CollapsingToolbarLayout

5
我正在使用Activity类,其中通常只有一个片段作为内容。在Activity中,我使用CollapsingToolbarLayout作为某些信息的标题栏,并且一切正常。但在某些情况下(当附加了某些片段时),我不想显示那些信息,我不希望CollapsingToolbarLayout在滚动时打开。
我想要实现的是锁定CollapsingToolbarLayout,防止它从片段中打开。我使用appBarLayout.setExpanded(false, true)以编程方式将其折叠。
2个回答

5

我提供了一种不同的方法,因为只在拖动NestedScrollView时设置嵌套滚动标志是无效的。用户仍然可以通过在应用栏上滑动来展开应用栏。

我将这个方法设置为“Utils”类中的静态函数。显然,在解锁时设置的标志取决于您的使用情况。

此函数假定您从扩展工具栏开始。

public static void LockToolbar(boolean locked, final AppBarLayout appbar, final CollapsingToolbarLayout toolbar) {

    if (locked) {
        // We want to lock so add the listener and collapse the toolbar
        appbar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {

            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                if (toolbar.getHeight() + verticalOffset < 2 * ViewCompat.getMinimumHeight(toolbar)) {
                    // Now fully expanded again so remove the listener
                    appbar.removeOnOffsetChangedListener(this);
                } else {
                    // Fully collapsed so set the flags to lock the toolbar
                    AppBarLayout.LayoutParams lp = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
                    lp.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED);
                }
            }
        });
        appbar.setExpanded(false, true);
    } else {
        // Unlock by restoring the flags and then expand 
        AppBarLayout.LayoutParams lp = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
        lp.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED);
        appbar.setExpanded(true, true);
    }

}

你为什么要在回答中发布随机代码?因为我的回答没有使用任何数组,而你的代码是由数组生成的异常,它们彼此之间没有关联。请不要混淆概念。 - Kuffs
2
注意!不要忘记调用这行代码: toolbar.setLayoutParams(lp);否则解决方法将无法生效。 - maXp
我必须在SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED的顶部添加SCROLL_FLAG_SCROLL。 根据文档,“必须设置此标志才能使其他任何标志生效”。 - geecko
为什么当工具栏折叠时,enterAlwaysCollapsed会锁定它? - Peter G. Williams

4

好的,我成功地解决了问题。诀窍是使用ViewCompat.setNestedScrollingEnabled(recyclerView, expanded);禁用嵌套滚动行为。

由于我在活动中使用一个片段作为内容视图,并将其放在后堆栈上,因此我只需检查后堆栈何时发生更改以及哪个片段可见即可。请注意,我在每个片段中都使用了NestedScrollView来触发可折叠式工具栏。这是我的代码:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            NestedScrollView nestedScrollView = (NestedScrollView)findViewById(R.id.nested_scroll_view);
            int size = getSupportFragmentManager().getBackStackEntryCount();
            if (size >= 1 && nestedScrollView != null) {
                if (getSupportFragmentManager().getBackStackEntryAt(size - 1).getName().equals("SpotDetailsFragment")) {
                    Log.d(LOG_TAG, "Enabling collapsible toolbar.");
                    ViewCompat.setNestedScrollingEnabled(nestedScrollView, true);
                } else {
                    Log.d(LOG_TAG, "Disabling collapsible toolbar.");
                    ViewCompat.setNestedScrollingEnabled(nestedScrollView, false);
                }
            }
        }
    });

这个帖子对我帮助很大,其中提供了另一个可能的解决方案: 需要禁用CollapsingToolbarLayout在某些片段上的展开


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接