2017-01-27 2 views
7

я столкнулся с непростой проблемой с андроида TabLayoutTabLayout удалить ненужный скроллинг

import android.support.design.widget.TabLayout; 

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

Когда я выбираю вкладку передовой влево, а затем прокручивать вкладки вправо и выберите вкладку передовую справа, TabLayout сначала снова показывает мне левую вкладку, а затем прокручивает выбранную вкладку вправо. Вот мой код установки

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; 
      } 
     } 
    } 

И раскладка

<?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' должен быть прямым потомком' CoordinatorLayout' хотя! https://developer.android.com/reference/android/support/design/widget/AppBarLayout.html – Mohsen

+0

Я попытался изменить его, но ничего не меняет – RexSplode

+0

Если вы прокомментируете вызов метода setStartingSelection в setupTabs, проблема по-прежнему сохраняется? –

ответ

0

После большого поиска я понял, что мне нужен другой компонент, который будет выглядеть как TabLayout, но не будет TabLayout. Поэтому я использовал ViewPagerIndicator.

Он очень похож на TabLayout, хотя ему не хватает интересных анимаций выбора и выбранных анимаций индикаторов вкладок, которые присутствуют в TabLayout. Он также не изменяет размер текста, чтобы он соответствовал вкладкам, что хорошо, и он не изменяет размер вкладок, чтобы они соответствовали текстам, что плохо (пробовал все параметры стиля, которые, как я знаю, не могли заставить его обернуть текст).

Но он выбирает вкладки просто отлично и без дополнительной прокрутки. К сожалению, AndroidArsenal не содержит решений, которые лучше, чем это (по крайней мере, это не было, когда я искал).

0

Измените свой метод, как показано ниже:

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); 
    } 

Я надеюсь, что это поможет вам.

+0

Прошу прощения, но я боюсь, что установка начального выбора здесь не поможет. Эта прокрутка появляется не только в первый раз, но каждый раз, когда вы прокручиваете вкладки и выбираете один из них – RexSplode

1

На самом деле вы имеете дело с проблемой прокрутки. Да. Дело в том, что TabLayout расширяет HorizontalScrollView. попробуйте что-то вроде этого.

public class CustomTabLayout extends TabLayout { 

public CustomTabLayout(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(context); 
} 

public CustomTabLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

public CustomTabLayout(Context context) { 
    super(context); 
    init(context); 
} 

void init(Context ctx){ 

} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    // Do not allow touch events. 
    return false; 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    // Do not allow touch events. 
    return false; 
} 

} 
+0

Дело в том, что если я переопределю эти методы, им придется реализовать для себя все правила выбора и прокрутки. И при условии, что большинство методов TabLayout являются частными, для этого подхода также потребуется использовать Reflection API. Но это возможно. – RexSplode

2

вы можете попробовать этот код

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) { } 
    }); 

или вы также можете сделать это непосредственно в последней строке

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

Спасибо, это сработало отлично. –