Design Library TabLayout, el indicador de tabulación rebotando después de desplazarse
Estoy trabajando con TabLayout en dos instancias, PagerAdapter y FragmentStatePagerAdapter. En ambos casos, el indicador de tabulación rebota cuando se pasa entre páginas. El indicador de tabulación no se salta al hacer clic en tabuladores para cambiar las páginas.
No estoy seguro de si es un error de mi parte, es un problema conocido, o parte de las directrices. Si necesita más código, o el otro ejemplo lo publicaré.
- No se pueden intercambiar fragmentos correctamente en las pestañas de la barra de acciones
- No se puede utilizar las pestañas con Sherlock
- Listview no actualizar en fragmento con las pestañas viewpager
- Cómo cambiar el estilo de pestaña en Android?
- Cómo actualizar el contenido de la ficha de fragmento en el botón de clic
FragmentStatePagerAdapter
mViewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { LogMeal log = mLogMealAdapter.getItem(position); return MealViewFragment.newInstance(log.getId()); } @Override public CharSequence getPageTitle(int position) { // Tab text LogMeal logMeal1 = mLogMealAdapter.getItem(position); String s; if (logMeal1.getMealName().toString().trim().length() > 12) { s = logMeal1.getMealName().substring(0, 12) + ".."; } else { s = logMeal1.getMealName(); } return s; } @Override public int getCount() { return mLogMealAdapter.getCount(); } }); tabs.setTabTextColors(Color.parseColor("#80ffffff"), Color.parseColor("#ffffff")); if (mLogMealAdapter.getCount() == 1) { tabs.setTabMode(TabLayout.MODE_FIXED); } else { tabs.setTabMode(TabLayout.MODE_SCROLLABLE); } tabs.setupWithViewPager(mViewPager); mViewPager.setCurrentItem(position);
XML
<RelativeLayout 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.support.v7.widget.Toolbar android:id="@+id/toolbar_meal_view" android:layout_width="match_parent" android:layout_height="56dp" android:background="@color/primary" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="48dp" android:layout_below="@+id/toolbar_meal_view" android:background="@color/primary" android:theme="@style/ToolbarTheme"/> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/tabs"/> <LinearLayout android:layout_width="match_parent" android:layout_height="10dp" android:layout_below="@+id/tabs" android:background="@drawable/toolbar_shadow"/> </RelativeLayout>
- Android TabLayout ViewPager no inflar el fragmento de la pestaña en backstack
- Pestañas de Viewpager Fragmento y Fragmentos normales
- Contenido de la barra ActionBar que se superpone
- Transacción entre fragmentos sólo dentro de una pestaña ActionBar
- ¿Cómo cargar la actividad del fragmento el método de creacion () de la barra seleccionada de la barra de acciones solo si la pestaña está seleccionada?
- Cambiar el índice de la pestaña de fragmentos con pestañas mediante programación
- Android ViewPager con la pestaña que no mantiene el estado tras la rotación de la pantalla
- Deshabilitar tabulaciones en TabLayout
Recientemente tuve un problema similar.
Mi solución:
1) Cambiar tabs.setupWithViewPager(mViewPager);
para
\\ use own OnPageChangeListener mViewPager.addOnPageChangeListener(new MyPageScrollListener(mTabLayout)); \\ Manually add tabs, for example: mTabLayout.addTab(mTabLayout.newTab().setText(mViewPager.getAdapter().getPageTitle(0))); mTabLayout.addTab(mTabLayout.newTab().setText(mViewPager.getAdapter().getPageTitle(1))); \\ use own OnTabSelectedListener mTabLayout.setOnTabSelectedListener(new MyOnTabSelectedListener());
2) Añadir implementación para oyentes personalizados
private class MyPageScrollListener implements ViewPager.OnPageChangeListener { private TabLayout mTabLayout; public MyPageScrollListener(TabLayout tabLayout) { this.mTabLayout = tabLayout; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if(mTabLayout != null) { mTabLayout.getTabAt(position).select(); } } @Override public void onPageScrollStateChanged(int state) { } } private class MyOnTabSelectedListener implements TabLayout.OnTabSelectedListener { @Override public void onTabSelected(TabLayout.Tab tab) { int position = tab.getPosition(); if (mViewPager.getCurrentItem() != position) { mViewPager.setCurrentItem(position, true); } } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }
Espero que ayude.
Es un error en la biblioteca de soporte de diseño 22.2.0
Tal vez se arreglará. https://code.google.com/p/android/issues/detail?id=175073
El error de " rebote " del indicador se ha corregido en la versión 22.2.1 y superior.
Simplemente actualice su build.gradle
:
dependencies { //... compile 'com.android.support:design:22.2.1' }
- Arraylist es del tipo LinkedTreeMap en lugar de Brewer
- "Esta aplicación no se ejecutará a menos que actualices Google Play Services" cuando la aplicación esté instalada en dispositivos reales