OnTabSelected Seleccionado No llamado

Acabo de migrar mi antigua ActionBar a nuevo TabLayout (Diseño de Material de Soporte).

Todo es genial pero no puedo interceptar la selección de onTabSelected El método onTabSelected solo se llama la primera vez que se muestra TabLayout , pero al hacer clic en las pestañas, ¡no pasa nada! ¿Alguna idea de lo que está mal con este código?

  tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); mViewPager = (ViewPager) findViewById(R.id.pager); if (mViewPager != null) { setupViewPager(); } tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { numTab = tab.getPosition(); prefs.edit().putInt("numTab", numTab).apply(); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); tabLayout.setupWithViewPager(mViewPager); 

Cuando llama a setupWithViewPager , esto llamará internamente setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager)); , OnTabSelectedListener su OnTabSelectedListener .

En su lugar, su oyente debe extender TabLayout.ViewPagerOnTabSelectedListener , a continuación, sobreescribir onTabSelected() y llamar a setOnTabSelectedListener() después de setupWithViewPager() :

 tabLayout.setupWithViewPager(mViewPager); tabLayout.setOnTabSelectedListener( new TabLayout.ViewPagerOnTabSelectedListener(mViewPager) { @Override public void onTabSelected(TabLayout.Tab tab) { super.onTabSelected(tab); numTab = tab.getPosition(); prefs.edit().putInt("numTab", numTab).apply(); } }); 

Aquí hay un ejemplo algo más completo con tres pestañas. Utiliza la nueva add OnTabSelectedListener lugar de set OnTabSelectedListener .

 TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); tabLayout.addTab(tabLayout.newTab().setText("Tab 3")); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); final PagerAdapter adapter = new PagerAdapter (getSupportFragmentManager(), tabLayout.getTabCount()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); Log.i("TAG", "onTabSelected: " + tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { Log.i("TAG", "onTabUnselected: " + tab.getPosition()); } @Override public void onTabReselected(TabLayout.Tab tab) { Log.i("TAG", "onTabReselected: " + tab.getPosition()); } }); 

Notas:

  • onTabSelected y onTabUnselected se llaman cada vez que hay un cambio en las pestañas.
  • onTabReselected se llama cada vez que se hace clic en una pestaña mientras se está mostrando.
  • Cambio de vista dentro de TabHost (una actividad, varias vistas)
  • ¿Cómo ir a otras pestañas haciendo clic en un botón de la pestaña actual en Android?
  • Android: establece las pestañas predeterminadas pero sin ningún contenido
  • Fragmento Tabhost Error: java.lang.IllegalStateException: No se conoce ninguna pestaña para la etiqueta null Cuando la conexión a Internet no está disponible
  • Cómo cambiar el color de la pestaña 'underbar' en actionbarsherlock
  • TabLayout contenido de la pestaña de actualización con una vista personalizada
  • ViewPager primer fragmento mostrado siempre es incorrecto con FragmentStatePager
  • ¿Por qué obtengo un error al intentar establecer el contenido de un tabspec en android?
  • Android: pestañas de las aplicaciones "Noticias y clima"
  • ¿Cómo configurar la pestaña predeterminada de múltiples vistas panorámicas con pestañas?
  • ¿Podemos establecer una imagen de fondo en pestañas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.