2017-01-27 8 views
7

Ich habe das heikle Problem mit Android TabLayout begegnetTabLayout entfernen unnötiges Scrollen

import android.support.design.widget.TabLayout; 

To see what's going on, look at this gif

Wenn ich die vorderste Registerkarte auf der linken Seite wählen, dann Registerkarten nach rechts scrollen und die vorderste Registerkarte Auf der rechten Seite zeigt TabLayout zuerst die linke Registerkarte erneut an und scrollt dann zur ausgewählten Registerkarte nach rechts. Hier ist mein Setup-Code

void setupTabs(ViewPager viewPager, TabLayout tabLayout) { 
     ProductsPagerAdapter adapter = new ProductsPagerAdapter(getChildFragmentManager(), rootCategory.getChildCategories()); 
     viewPager.setAdapter(adapter); 
     tabLayout.setupWithViewPager(viewPager); 

     setStartingSelection(viewPager, adapter); 


    } 

    private void setStartingSelection(ViewPager viewPager, ProductsPagerAdapter adapter) { 
     for(int i = 0 ; i < adapter.getCount(); i++){ 
      String title = (String) adapter.getPageTitle(i); 
      if(title.equals(selectedCategory.getName())){ 
       viewPager.setCurrentItem(i); 
       break; 
      } 
     } 
    } 

und das Layout

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    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:fitsSystemWindows="true" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="@color/toolbar_color" 
      app:navigationIcon="@drawable/ic_back_white" 
      app:title="@string/title_transport" 
      app:titleTextColor="@color/title_color"/> 


     <android.support.design.widget.TabLayout 
      android:id="@+id/tab_layout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:tabMode="scrollable" 
      app:tabTextColor="@color/white" 
      app:tabIndicatorColor="@color/tab_indicator" 
      app:tabGravity="fill"/> 

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

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="0px" 
     android:layout_weight="1" 
     android:background="@android:color/white" /> 

</LinearLayout> 
+0

'AppBarLayout' sollte ein direktes Kind' CoordinatorLayout' sein, obwohl direkt tun! https://developer.android.com/reference/android/support/design/widget/AppBarLayout.html – Mohsen

+0

Ich habe versucht, es zu ändern, aber es ändert nichts – RexSplode

+0

Wenn Sie in Aufruf von setStartingSelection-Methode in SetupTabs kommentieren, tut Problem besteht immer noch? –

Antwort

0

Nach einer Menge Suche habe ich verstanden, dass ich eine andere Komponente brauche, die wie TabLayout aussehen wird, aber nicht TabLayout sein wird. Also habe ich ViewPagerIndicator verwendet.

Es ist sehr ähnlich zu TabLayout, obwohl es keine coole Auswahlanimationen und ausgewählte Tab-Indikator-Animationen gibt, die in TabLayout vorhanden sind. Es ändert auch nicht die Größe des Textes, um Tabulatoren zu passen, was gut ist, und passt die Tabs auch nicht an Text an, was schlecht ist (habe alle Style-Parameter ausprobiert, die ich kenne - kann den Text nicht umbrechen).

Aber es wählt Tabs einfach gut und ohne zusätzliches Scrollen. AndroidArsenal enthält leider keine Lösungen, die besser sind (zumindest nicht, als ich gesucht habe).

0

Ändern Sie Ihre Methode als unten an:

private void setStartingSelection(ViewPager viewPager, ProductsPagerAdapter adapter) { 
     int tabPosition=0; 
     for(int i = 0 ; i < adapter.getCount(); i++){ 
      String title = (String) adapter.getPageTitle(i); 
      if(title.equals(selectedCategory.getName())){ 
       tabPosition=i; 
       break; 
      } 
     } 
     viewPager.setCurrentItem(tabPosition); 
    } 

Ich hoffe, das Ihnen hilft.

+0

auswählen. Es tut mir leid, aber ich fürchte, dass die Startauswahl hier nicht hilft. Dieses Scrollen erscheint nicht nur beim ersten Mal, sondern jedes Mal, wenn Sie Tabulatoren scrollen und eines davon auswählen. – RexSplode

1

Eigentlich beschäftigen Sie sich mit Scrolling-Problem. Ja. Die Sache ist, TabLayout erweitert HorizontalScrollView. versuchen, etwas wie das.

+0

Die Sache ist, wenn ich diese Methoden überschreibe, muss ich das gesamte Auswahl- und Scroll-Verhalten für mich implementieren. Und da die meisten TabLayout-Methoden privat sind, muss dieser Ansatz auch die Reflection-API verwenden. Aber es ist eine Möglichkeit. – RexSplode

2

können Sie diesen Code versuchen

tabLayout.setupWithViewPager(viewPager); 
    // little hack to prevent unnecessary tab scrolling 
    tabLayout.clearOnTabSelectedListeners(); 
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition(), false); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { } 
    }); 

oder Sie können dies auch für die letzte Zeile

tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager) { 
    @Override 
    public void onTabSelected(TabLayout.Tab tab) { 
     viewPager.setCurrentItem(tab.getPosition(), false); 
    } 
}); 
+0

Danke, das hat perfekt funktioniert. –