Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use a TabLayout with Toolbar inside CollapsingToolbarLayout?

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

<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/main_content"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:fitsSystemWindows="true">      <android.support.v4.view.ViewPager         android:id="@+id/viewpager"         android:layout_width="match_parent"         android:layout_height="match_parent"         app:layout_behavior="@string/appbar_scrolling_view_behavior" />      <android.support.design.widget.AppBarLayout         android:id="@+id/appbar"         android:layout_width="match_parent"         android:layout_height="@dimen/detail_backdrop_height"         android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"         android:fitsSystemWindows="true">          <android.support.design.widget.CollapsingToolbarLayout             android:id="@+id/collapsing_toolbar"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:background="@color/primary_dark"             android:minHeight="150dip"             app:layout_scrollFlags="scroll|exitUntilCollapsed"             android:fitsSystemWindows="true"             app:contentScrim="?attr/colorPrimary"             app:expandedTitleMarginStart="48dp"             app:expandedTitleMarginBottom="60dp"             app:expandedTitleMarginEnd="64dp">              <ImageView                 android:id="@+id/backdrop"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:scaleType="centerCrop"                 android:fitsSystemWindows="true"                 app:layout_collapseMode="parallax" />              <android.support.v7.widget.Toolbar                 android:id="@+id/toolbar"                 android:layout_width="match_parent"                 android:layout_height="110dip"                 android:layout_gravity="top"                 app:popupTheme="@style/ThemeOverlay.AppCompat.Light"                 app:layout_collapseMode="pin" />              <android.support.design.widget.TabLayout                 android:id="@+id/tabs"                 android:layout_width="match_parent"                 android:layout_height="wrap_content"                 android:layout_gravity="bottom"/>          </android.support.design.widget.CollapsingToolbarLayout>      </android.support.design.widget.AppBarLayout>  </android.support.design.widget.CoordinatorLayout> 

This puts on something like this when the CollapsingToolbar is opened which is exactly what I am looking for:

enter image description here

But when I collapse it (by pulling the image up) I get something like this

enter image description here

And this is due to the reason I've set the Toolbar to have a height of 110dip if I leave the default settings the Tabs and the toolbar title overlap. So I am looking for the right way to do that so that the title of the Toolbar gets it's right place on the appbar and the tablayout is under it. Is there a way this can be achieved ?

like image 772
Todor Grudev Avatar asked Jun 06 '15 08:06

Todor Grudev


People also ask

How do I use Tablayout with Viewpager?

Tab layout are visible below toolbar with View pager, used to create swipeable views . Tabs are designed to work with fragments. Use them to swipe fragments in view pager.

How do you Tablayout on Android?

This example demonstrates how do I create a Tab Layout in android app. Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 3 − Add the following code to res/layout/activity_main. xml.


1 Answers

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" /> 

like image 128
Alexandros Ioannou Avatar answered Sep 22 '22 18:09

Alexandros Ioannou