首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >工具栏在向下滑动时展开

工具栏在向下滑动时展开
EN

Stack Overflow用户
提问于 2016-03-06 00:10:31
回答 7查看 6.2K关注 0票数 14

在我的应用程序中,我有一个折叠工具栏。如果我启动一个特定的片段,我想折叠工具栏,这样它的行为就像一个“正常的”片段,并且用户不能自己扩展它。下面是我在工具栏上使用的布局:

代码语言:javascript
运行
复制
<android.support.design.widget.AppBarLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/appBarLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:titleEnabled="false"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:src="@drawable/drawer_background"
            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
            android:layout_width="match_parent"
            android:layout_height="172dp"
            android:scaleType="centerCrop"
            app:layout_collapseMode="parallax"
            android:minHeight="100dp" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolBar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:layout_scrollFlags="scroll|enterAlways" />

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

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

我还可以从如下代码中折叠布局:

代码语言:javascript
运行
复制
appBarLayout.setExpanded(false, false);

final AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams();
params.setScrollFlags(0);
collapsingToolbarLayout.setLayoutParams(params);

但这没什么用。如果用户从工具栏向下滑动,它将展开。

你知道为什么吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-03-15 17:42:42

核心问题是到目前为止还没有CollapsingToolbarLayout.lock();方法(支持设计的第23.2.1版)。希望这个特性将包含在未来的版本中。在此之前,我建议采取以下解决办法:

您可以使用以下方法折叠和锁定工具栏:

代码语言:javascript
运行
复制
appbar.setExpanded(false,false);
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();
lp.height = (int) getResources().getDimension(R.dimen.toolbar_height);

并解锁:

代码语言:javascript
运行
复制
 CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();
 lp.height = (int) getResources().getDimension(R.dimen.nav_header_height);

但是,在上面的代码中出现了一个问题:

当强行折叠CoordinatorLayout时,工具栏的标题就消失了,CollapsingToolbarLayout.setTitle(CharSequence title);也不再工作了。为了解决这个问题,我们在工具栏中添加了一个TextView,并相应地操作它的可见性。(我们希望它“消失”在一个片段中,它的工具栏‘解锁’和‘可见’在一个片段中有它的工具栏‘锁定’。

我们必须将TextView的android:textAppearance设置为与CollapsingToolbarLayout的app:collapsedTitleTextAppearance相同,以保持一致性,并避免使用不同的工具栏文本大小和颜色干扰用户。

总之,使用这样的接口:

代码语言:javascript
运行
复制
public interface ToolbarManipulation {
    void collapseToolbar();
    void expandToolbar();
    void setTitle(String s);
}

像这样的例子:

代码语言:javascript
运行
复制
@Override
    public void collapseToolbar(){
        appbar.setExpanded(false,false);
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();
        lp.height = (int) getResources().getDimension(R.dimen.toolbar_height);
        toolbarCollapsedTitle.setVisibility(View.VISIBLE);
    }

    @Override
    public void expandToolbar() {
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();
        lp.height = (int) getResources().getDimension(R.dimen.nav_header_height);
        toolbarCollapsedTitle.setVisibility(View.GONE);
    }

    @Override
    public void setTitle(String s) {
        collapsingToolbarLayout.setTitle(s);
        toolbarCollapsedTitle.setText(s);
        collapsingToolbarLayout.invalidate();
        toolbarCollapsedTitle.invalidate();
    }

主要的xml如下:

代码语言:javascript
运行
复制
....
  <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:collapsedTitleTextAppearance="@style/CollapsedAppBar"

            >
                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    android:background="?attr/colorPrimary"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/AppTheme.PopupOverlay"
                    >
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="?attr/actionBarSize"
                        android:visibility="gone"
                        android:layout_gravity="center_vertical|start"
                        android:gravity="center_vertical|start"
                        android:id="@+id/toolbar_collapsed_title"
                        android:textAppearance="@style/CollapsedAppBar"
                        />
                </android.support.v7.widget.Toolbar>
        </android.support.design.widget.CollapsingToolbarLayout>
......

您可以根据需要锁定和解锁工具栏。您的片段应该在它们的onResume()中调用这些函数;

我上传了一个示例实现这里

注意:这只是一个解决办法,显然不是最干净的解决方案。我们正在等待更新版本的com.android.support来解决这个问题。

票数 21
EN

Stack Overflow用户

发布于 2016-03-09 19:49:34

我不太确定这是不是你要找的

代码语言:javascript
运行
复制
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams(); 
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior(); 
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
    @Override
    public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
        return false;
    } 
});
票数 13
EN

Stack Overflow用户

发布于 2016-03-11 20:31:08

尝试更改AppBar的高度。对我来说很管用。

代码语言:javascript
运行
复制
public void lockAppBar() {
    int appbarHeight = (int)getResources().getDimension(R.dimen.your_fixed_appbar_height);
    getView().findViewById(R.id.my_appbar).getLayoutParams().height = appbarHeight; 
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35821502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档