How to use a TabLayout with Toolbar inside CollapsingToolbarLayout?

后端 未结 18 2115
逝去的感伤
逝去的感伤 2020-11-27 11:46

I am looking at the chrisbanes/cheesesquare and I am trying to put TabLayout with a Toolbar inside a CollapsingToolbarLayout, and here is my code



        
相关标签:
18条回答
  • 2020-11-27 12:11

    After 2 whole days of trying to find a pure Android solution here is my solution.

    Target: Tabs under the Toolbar with image background behind both views

    (TL;DR: See XML attached)

    The behavior I want to achieve is to have the CollapsingToolbarLayout and the TabLayout on top of an image and when the "header" is scrolled up (out of the screen) then to show the ActionBar (toolbar) with the TabLayout under it.

    The Problem:

    Since the CollapsingToolbarLayout will hide all children views when collapsed except the Toolbar view then the TabLayout has to be placed outside the CollapsingToolbarLayout but inside the AppBarLayout so that it is "docked" at the top of the screen and under the Toolbar. The issue now is that the ImageView placed inside the CollapsingToolbarLayout will not be under the TabLayout but above it vertically.

    The Solution:

    To solve this issue we need to make the ImageView taller so that if we were to place the TabLayout inside the CollapsingToolbarLayout it will cover it. But because we placed the TabLayout outside the CollapsingToolbarLayout we need to make sure that the ImageView is drawn even if its parent view (CollapsingToolbarLayout) is shorter. clipChildren="false" TO THE RESCUE! clipChildren tells a ViewGroup to DO NOT clip its children view if they are bigger than it's size, so essentially now we can make the ImageView taller and it will still be drawn under the TabLayout. This way we can have both the CollapsingToolbarLayout and the TabLayout above a nice image!

    My Layout xml:

    <?xml version="1.0" encoding="utf-8"?>
    

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clipChildren="false" /////IMPORTANT!!!!!!
        android:theme="@style/AppTheme.AppBarOverlay">
    
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:clipChildren="false"  /////IMPORTANT!!!!!!
            android:fitsSystemWindows="true"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            >
    
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:scaleType="centerCrop"
                android:src="@drawable/poster"
                app:layout_collapseMode="parallax" />
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />
        </android.support.design.widget.CollapsingToolbarLayout>
    
        <android.support.design.widget.TabLayout
            android:id="@+id/main_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMode="scrollable" />
    </android.support.design.widget.AppBarLayout>
    
    
    <include layout="@layout/content_main" />
    

    0 讨论(0)
  • 2020-11-27 12:11

    The code below implements the action Expand / Collapse toolbar.

    Basically we will have a
    CoordinatorLayout (FrameLayout)
    AppBarLayout (vertical LinearLayout Which implements many of the features of stuff designs),
    CollapsingToolbarLayout (is a wrapper for Toolbar)
    ImageView and Toolbar

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
        <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:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">
    
    
            <ImageView
                android:id="@+id/header"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/logo"
                android:minHeight="300dp"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax" />
    
            <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:minHeight="?attr/actionBarSize"
                app:layout_collapseMode="pin" />
    
    
        </android.support.design.widget.CollapsingToolbarLayout>
    
    
    <android.support.design.widget.TabLayout
                android:id="@+id/tabs"
                android:layout_width="match_parent"
                android:layout_height="50dip"
                app:tabGravity="center"
                app:tabMode="scrollable"
                android:gravity="bottom"/>
    
    </android.support.design.widget.AppBarLayout>
    
    
        <FrameLayout
            android:id="@+id/fr_container_home"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    
    </android.support.design.widget.CoordinatorLayout>
    
    Observation
    - FrameLayout is necessary app: layout_behavior = "@string/appbar_scrolling_view_behavior"
    -TOOLBAR Not need backgroud, insert the color in the attribute app:contentScrim = "?Attr/ColorPrimary" from our CollapsingToolbarLayout
    

    In your class

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    mCollapsingToolbarLayout = (CollapsingToolbarLayout)findViewById(R.id.collapsing_toolbar);
    mCollapsingToolbarLayout.setTitle("YourTitle");
    setSupportActionBar(toolbar);
    
    0 讨论(0)
  • 2020-11-27 12:11

    Try to put the Toolbar inside the CollapsingToolbar with app:layout_collapseMode="pin" and the TabLayout outside with app:layout_scrollFlags="enterAlways"

    0 讨论(0)
  • 2020-11-27 12:12

    I've created this sample project where I use TabLayout inside of CollapsingToolbarLayout

    Tested on API 14-23. Works without any problems.

    0 讨论(0)
  • 2020-11-27 12:13

    I had a similar problem, and my solution was ridiculously simple. All I had to do was setting the toolbar as the support actionbar (I am using a Theme.NoActionBar style base)

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    
    0 讨论(0)
  • 2020-11-27 12:14

    It turns out that since the AppBarLayout extends LinearLayout, you can have two CollapsingToolBarLayouts (extends FrameLayout) in it. What I did was have the first CollapsingToolBarLayout house the contents I wanted to disappear, and gave it the AppBarLayout flag:

    app:layout_scrollFlags="scroll|exitUntilCollapsed"

    For the second CollapsingToolbarLayout that actually had the tabs, I set it's scroll flags to:

    app:layout_scrollFlags="scroll|enterAlways"

    The final XML looks like this and it gives me what I want.

        <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    
        <android.support.design.widget.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:expandedTitleMarginBottom="@dimen/quadruple_margin"
                app:layout_collapseParallaxMultiplier="0.7"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">
    
                <RelativeLayout
                    android:id="@+id/header_view"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:animateLayoutChanges="true"
                    android:background="@color/black_40">
    
                    <!-- YOUR CONTENT HERE -->
    
                </RelativeLayout>
    
                <android.support.v7.widget.Toolbar
                    android:id="@+id/action_bar"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/abc_action_bar_default_height_material"
                    app:contentInsetLeft="@dimen/triple_margin"
                    app:contentInsetStart="@dimen/triple_margin"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/Theme.AppCompat.NoActionBar"
                    app:theme="@style/Theme.AppCompat.NoActionBar" />
            </android.support.design.widget.CollapsingToolbarLayout>
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways">
    
                <android.support.design.widget.TabLayout
                    android:id="@+id/tabs"
                    android:layout_width="match_parent"
                    android:layout_height="48dp"
                    android:layout_gravity="bottom"
                    android:layout_marginTop="@dimen/half_margin"
                    app:layout_scrollFlags="enterAlways"
                    app:tabBackground="@color/transparent"
                    app:tabGravity="center"
                    app:tabMode="scrollable"
                    app:tabSelectedTextColor="@color/white"
                    app:tabTextColor="@color/grey_400" />
            </android.support.design.widget.CollapsingToolbarLayout>
        </android.support.design.widget.AppBarLayout>
    </android.support.design.widget.CoordinatorLayout>
    
    0 讨论(0)
提交回复
热议问题