2

alle! Ich habe ein Fragment im FrameLayout-Container innerhalb der Aktivität, die Navigationsschublade hat. Fragment hat TabLayout. Und das Problem ist, wie Sie sehen können, dass die Symbolleiste Schatten auf Fragment TabLayout ablegt. Ich möchte TabLayout nicht in das AppBar-Layout von Activity einfügen, da ich keinen Zugriff auf das Fragment habe und das TabLayout sonst nirgendwo benötigt.Toobar wirft Schatten auf TabLayout

Screenshot

Das ist mein activity_main.xml

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

<include 
    layout="@layout/app_bar_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<android.support.design.widget.NavigationView 
    android:id="@+id/mainNavigationView" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main" 
    app:menu="@menu/activity_main_drawer" /> 

Und das ist app_bar_main.xml

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

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

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

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

    <FrameLayout 
     android:id="@+id/mainFragmentContainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</LinearLayout> 

Dies ist fragment_by_day_schedule.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:orientation="vertical"> 

<android.support.design.widget.TabLayout 
    android:id="@+id/byDayTabLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:tabBackground="?attr/colorPrimary" 
    app:tabMode="scrollable" /> 

<android.support.v4.view.ViewPager 
    android:id="@+id/byDayViewPager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

</LinearLayout> 

ich auch die Toolbar ausblenden möchten, wenn ich die Liste nach oben in Fragment innerhalb ViewPager

Haben Sie irgendwelche Ideen wie kann ich das erreichen?

+0

Was macht Sie denken, Sie keinen Zugriff auf die tablayout aus dem Fragment haben, wenn Sie es in der Symbolleiste setzen? Ehrlich gesagt, ich denke, es ist ein viel besseres und weit verbreiteteres Muster, die Registerkarten in der Symbolleiste zu haben. Sie können auch erreichen, dass die Werkzeugleiste ausgeblendet wird, wenn Sie den Viewpager nach oben bewegen. – gaara87

+0

Überprüfen Sie meine Antwort erneut. Ich habe für deine zweite Frage aktualisiert. –

Antwort

3

Verwenden Sie dies. Funktioniert an meinen Projekten.

ViewCompat.setElevation(mAppBarLayout, 0); 

Und Ihre zweite Frage, wie Sie Ihre Symbolleiste ausblenden? Ändern Sie das lineare Layout des übergeordneten Layouts in Layout.

<android.support.design.widget.CoordinatorLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

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

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

    <FrameLayout 
     android:id="@+id/mainFragmentContainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</android.support.design.widget.CoordinatorLayout> 

Danach müssen Sie Android sagen, wenn Symbolleiste sollte ausblenden. Sie sollten feststellen, welche Ansicht scrollen kann. Sie haben diese app:layout_behavior="@string/appbar_scrolling_view_behavior" in Ihrem ViewPager hinzugefügt.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:orientation="vertical"> 

<android.support.design.widget.TabLayout 
    android:id="@+id/byDayTabLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:tabBackground="?attr/colorPrimary" 
    app:tabMode="scrollable" /> 

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

Vielen Dank. Ok Ich werde versuchen – frozzyk

+0

Ich wusste nie über ViewCompat.setElevation() –

1

Sie müssen sicherstellen, dass alles die gleiche Höhe hat.

+0

Ich möchte nicht 'Elevation' verwenden, weil es nicht auf Pre-Lollipop funktioniert. – frozzyk

+3

Ich bin mir nicht sicher, ob dies ein Szenario sein soll oder nicht ... Schatten werden aus der Höhe gezeichnet. Wenn Sie keine Schatten möchten, sollten Sie eine Höhe von 0 angeben. Dies schmälert jedoch Ihr Design und widerspricht dem Material Design-Sprachmuster der Verwendung von Oberflächen. – apelsoczi

+0

Gerade versucht, dass auf Pre-Lollipop und das funktioniert, aber auf API 21+ funktioniert nicht. Kein Effekt ( – frozzyk

1

Die AppBarLayout in Support-Bibliothek v24.0.0 verwendet StateListAnimator. Die Einstellung appBayLayout.setElevation(0) hat keine Auswirkungen, wenn Sie in dieser neuen Version verwenden.

Stattdessen versuchen Höhe auf 0 in der StateListAnimator Einstellung wie folgt für Build.VERSION.SDK_INT >= 21:

StateListAnimator stateListAnimator = new StateListAnimator(); 
stateListAnimator.addState(new int[0], ObjectAnimator.ofFloat(view, "elevation", 0)); 
appBarLayout.setStateListAnimator(stateListAnimator); 
+1

Vielen Dank! Ich werde es versuchen. – frozzyk

1

Von Support Library v24.0.0 AppBarLayout verwendet StateListAnimator für Satz Höhe. Für das gleiche Verhalten zu bekommen, wie Pre-24.0.0 nur Animator als null und Rufaufbau setElevation():

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    appbarLayout.setStateListAnimator(null); 
} 

ViewCompat.setElevation(appbarLayout, 0);