0

Le problème est simple. J'ai un TabLayout dans un CoordinatorLayout, et je configure dynamiquement un CustomView pour chaque onglet à l'exécution. Les onglets contiennent des animations et du contenu personnalisé qui sont actuellement tronqués sur les bords de l'onglet.Android - Empêcher les enfants de TabLayout d'écrêter le contenu de l'onglet

J'ai défini clipToPadding et clipChildren sur false dans toute la hiérarchie de vue sans succès. Les onglets sont toujours tronqués. Donc, la question est, comment éviter d'écrêter les vues personnalisées de l'onglet à l'intérieur d'un TabLayout?

est ici un code afin que vous puissiez voir ce que je fais:

<?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:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clipToPadding="false" 
    android:clipChildren="false" 
    android:fitsSystemWindows="false" 
    tools:context=".MainTabbedActivity"> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingTop="@dimen/appbar_padding_top" 
    android:elevation="4dp" 
    android:clipToPadding="false" 
    android:clipChildren="false" 
    android:fitsSystemWindows="false" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:clipToPadding="false" 
     android:clipChildren="false" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways" 
     app:popupTheme="@style/AppTheme.PopupOverlay"> 

    </android.support.v7.widget.Toolbar> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:clipToPadding="false" 
     android:clipChildren="false" 
     app:tabPaddingBottom="-1dp" 
     app:tabPaddingEnd="-1dp" 
     app:tabPaddingStart="-1dp" 
     app:tabPaddingTop="-1dp" 
     app:tabIndicatorColor="@android:color/white"/> 

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

<android.support.v4.view.ViewPager 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/fab" 
    ... /> 

Et puis, un onglet personnalisé ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="wrap_content" 
android:clipChildren="false" 
android:clipToPadding="false" 
android:layout_height="wrap_content"> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="32dp" 
    android:scaleType="fitCenter" 
    android:layout_marginBottom="-4dp" 
    android:adjustViewBounds="true" 
    android:id="@+id/tab_pic" /> 

<TextView 
    android:id="@+id/tab_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/something" 
    android:textColor="@color/white" 
    android:textStyle="bold" 
    android:textSize="12sp" 
    android:visibility="invisible"/> 

Le résultat est le ImageView étant écrêté lors de l'animation de sa position/limites.

Salutations

Répondre

2

Ok, c'était rapide. J'ai trouvé la solution. Il me semble que Android crée une vue parent intermédiaire entre le TabLayout et le contenu de l'onglet réel.

Ce faisant, les éléments suivants pour chaque onglet ...:

ViewGroup realTabs = ((ViewGroup) mTabLayout.getChildAt(0)); 
    realTabs.setClipToPadding(false); 
    realTabs.setClipChildren(false); 

    if (realTabs.getChildAt(0) instanceof ViewGroup) { // <-- This is the intermediate parent ViewGroup 
     ((ViewGroup)realTab0.getChildAt(0)).setClipToPadding(false); 
     ((ViewGroup)realTab0.getChildAt(0)).setClipChildren(false); 
    } 

... va résoudre le problème.

Remerciements