【问题标题】:AppBarLayout take space after setVisibility(View.GONE)AppBarLayout 在 setVisibility(View.GONE) 之后占用空间
【发布时间】:2015-12-18 17:12:40
【问题描述】:

我想隐藏我的 AppBarLayout 以动态添加一个将占用屏幕高度的视图。 为此,我想通过将 AppBarLayout 的可见性设置为 GONE 来临时删除视图。 视图不可见,但占用屏幕空间(屏幕高度的一半)。

我的 XML 代码:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinatorFriendProfil"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#81D4FA"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/fProfilAppBar"
    android:layout_width="match_parent"
    android:layout_height="250dp"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/fProfilCollapsing"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#B3E5FC"
        android:gravity="center"
        android:orientation="vertical"
        app:contentScrim="#03A9F4"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <LinearLayout
            android:id="@+id/fProfilUserInfo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical">

            <com.neden.neden.RoundedImageView
                android:id="@+id/ivFriendPicture"
                android:layout_width="150sp"
                android:layout_height="150sp"
                android:layout_gravity="center"
                android:fitsSystemWindows="true"
                android:src="@drawable/photo"
                app:border_color="#64B5F6"
                app:border_width="4dp"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.7" />

            <TextView
                android:id="@+id/fProfilName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textSize="15pt" />

        </LinearLayout>

        <android.support.v7.widget.Toolbar
            android:id="@+id/fProfilToolbar"
            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>

<FrameLayout
    android:id="@+id/fProfilContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>

【问题讨论】:

    标签: android android-coordinatorlayout android-collapsingtoolbarlayout android-appbarlayout


    【解决方案1】:

    我能够通过将所有内容从 CollapsingToolbarLayout (CTL) 转移到 Toolbar 来解决这个问题,使 Toolbar 成为 CTL 的唯一继承者。然后我将 CTL 的高度设置为wrap_content,在代码中我使用了toolbar.setVisibility(View.GONE)。请注意,您可能想要更改 Toolbar 内部的布局,在其子元素周围添加一些包装器,例如 RelativeLayout 或其他内容。

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
    
        <android.support.constraint.ConstraintLayout
            android:id="@+id/activity_main_root_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/default_page_background_color"
            android:orientation="vertical"
            tools:context=".home.ui.MainActivity">
    
            <android.support.design.widget.CoordinatorLayout
                android:id="@+id/page_container"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:background="@color/default_page_background_color"
                android:fitsSystemWindows="true"
                app:layout_constraintBottom_toTopOf="@id/home_nav_tabs"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">
    
                <android.support.design.widget.AppBarLayout
                    android:id="@+id/appbar_layout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:fitsSystemWindows="false"
                    android:orientation="vertical"
                    android:theme="@style/AppTheme.AppBarOverlay"
                    app:elevation="0dp">
    
                    <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:layout_scrollFlags="scroll|enterAlways|snap"
                        app:scrimAnimationDuration="300">
    
                        <android.support.v7.widget.Toolbar
                            android:id="@+id/toolbar"
                            android:layout_width="match_parent"
                            android:layout_height="?attr/actionBarSize"
                            app:buttonGravity="top"
                            app:layout_collapseMode="none"
                            app:popupTheme="@style/AppTheme.PopupOverlay">
    
                            ...
    

    【讨论】:

      【解决方案2】:

      你的问题是由这一行引起的

          app:layout_behavior="@string/appbar_scrolling_view_behavior"
      

      您必须在 CoordinatorLayout 上以编程方式设置它,而不是具有该字段的实际容器片段。

      方法如下

          mContainer = (FrameLayout) findViewById(R.id.main_content_container);
      
          CoordinatorLayout.LayoutParams params =
                  (CoordinatorLayout.LayoutParams) mContainer.getLayoutParams();
          params.setBehavior(null);
      
          mContainer.requestLayout();
      

      如果你想让它再次滚动

         params.setBehavior(new AppBarLayout.ScrollingViewBehavior());
      

      【讨论】:

      • 在 SO 上尝试了太多解决方案后,这个答案对我有用。
      【解决方案3】:

      尝试将 AppBarLayout 的高度设置为零

      AppBarLayout appBar=(AppBarLayout)findViewById(R.id.fProfilAppBar);
      LinearLayout.LayoutParams params=appBar.getLayoutParams();
      params.height=0;
      appBar.setLayoutParams(params);
      

      【讨论】:

      • 它可以工作,但是当我这样做时,我的 FrameLayout 不会将 match_parent 用于 layout_height
      • 你说“layout_height 不采用 match_parent”是什么意思?它不适合屏幕?
      • 对不起英语。我希望 FrameLayout 占据屏幕的所有高度,但是当我设置 appBarLayout 时,FrameLayout 位于屏幕顶部而不是底部(如 margin_bottom 但我在代码中看不到任何边距)。为了简化,我想要 android:layout_height:"match_parent"
      • 这可能是由android:fitsSystemWindows="true" 引起的。尝试从CoordinatorLayout/FrameLayout 添加/删除它。或者只是将layout_marginTop 添加到FrameLayout
      • 我尝试了所有组合,但它不适用于 android:fitsSystemWindows="true"
      猜你喜欢
      • 2018-02-26
      • 2013-04-17
      • 2016-08-31
      • 2015-12-20
      • 2017-04-13
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多