I've encountered the tricky problem with android TabLayout
import android.support.design.widget.TabLayout;
When I select the foremost tab to the left, then scroll tabs to the right and select the foremost tab to the right, TabLayout first shows me the left tab again and then scrolls to selected tab to the right. Here's my 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;
}
}
}
And 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>
Actually you are dealing with Scrolling issue. Yes. the thing is, TabLayout Extends HorizontalScrollView. try Something like this.
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;
}
}
you can try this code
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) { }
});
or you can also do this directly for the last line
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager) {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition(), false);
}
});
I think it's worth using TabLayoutMediator
and it will look like this
TabLayoutMediator(tabs, view_pager, true, false) { tab, position ->
tab.text = ""
}.attach()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With