2012-10-01 37 views
6

Estoy frente a un problema con respecto a la pestaña golpe. Mi proyecto está basado en Android 3.2. Estoy implementando el deslizamiento de pestañas usando la biblioteca de soporte 4.0 (android-support-v4.jar). Todo implementado está trabajando bien, pero cuando despliego mi aplicación a un dispositivo de ICS, a continuación, en el modo vertical estoy consiguiendo una ruleta en la barra de acción para la selección de la pestaña. En el modo vertical, la selección de pestañas no cambia cuando se realiza el deslizamiento aunque el contenido está cambiando y todo funciona bien en modo horizontal.Cómo mostrar fragmento seleccionado en la pestaña de la barra de acción

final ActionBar actionBar = getActionBar(); 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
actionBar.setDisplayHomeAsUpEnabled(true); 
// Set up the ViewPager with the sections adapter. 
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager); 

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position) { 
     actionBar.setSelectedNavigationItem(position); 
    } 

}); 

He intentado poner actionBar.setSelectedNavigationItem(position); punto de interrupción en esta línea e incluso en el modo de retrato se está haciendo llamada pero la selección no está cambiando.

¿Alguien puede ayudar con esto?

Editado: Encontrado un similar problem pero no ve exactamente la forma en que se resuelve y cómo integrarlo en mi código.

+0

Creo que esto funciona en mi muestra: https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager/TabPager Sin embargo, recomendaría se tiene en cuenta que cambian de lengüetas de la barra de acción a 'PagerTabStrip' o el sabor de la pestaña ViewPagerIndicator, para las pestañas consistentes a través de orientaciones: https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager/Indicator – CommonsWare

+0

Gracias por la respuesta, lo haré ver los enlaces, y necesito usar deslizar solo la pestaña, pero gracias por la sugerencia. Intentaré implementar PagerTabStripe y ver si esto es mejor. – Android

Respuesta

16

Problema: Debido a un estado insuficiente de la plataforma, la plataforma utiliza la navegación contraída (es decir, Spinner). El sistema de auto-determina NAVIGATION_MODE_TABS para el paisaje & NAVIGATION_MODE_LIST para el retrato, cambiando la orientación de horizontal a vertical actualiza la interfaz de usuario, pero por alguna razón no se actualiza la propiedad del modo de navegación para NAVIGATION_MODE_LIST y por lo tanto mActionView.setDropdownSelectedPosition (posición) no se llama. Véase el siguiente código de ActionBarImpl: setSelectedNavigationItem

public void setSelectedNavigationItem(int position) { 
    switch (mActionView.getNavigationMode()) { 
    case NAVIGATION_MODE_TABS: 
     selectTab(mTabs.get(position)); 
     break; 
    case NAVIGATION_MODE_LIST: 
     mActionView.setDropdownSelectedPosition(position); 
     break; 
    default: 
     throw new IllegalStateException(
       "setSelectedNavigationIndex not valid for current navigation mode"); 
    } 
} 

solución Solución: través de la reflexión que podemos conseguir el objeto spinner ficha y llamar al método setSelection.

private Spinner getTabSpinner() 
{ 
    try 
    { 
     int id = getResources().getIdentifier("action_bar", "id", "android"); 
     View actionBarView = findViewById(id); 

     Class<?> actionBarViewClass = actionBarView.getClass(); 
     Field mTabScrollViewField = actionBarViewClass.getDeclaredField("mTabScrollView"); 
     mTabScrollViewField.setAccessible(true); 

     Object mTabScrollView = mTabScrollViewField.get(actionBarView); 
     if (mTabScrollView == null) { 
      return null; 
     } 

     Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField("mTabSpinner"); 
     mTabSpinnerField.setAccessible(true); 

     Object mTabSpinner = mTabSpinnerField.get(mTabScrollView); 
     if (mTabSpinner != null) 
     { 
      return (Spinner)mTabSpinner; 
     } 
    } 
    catch (Exception e) { 
     return null; 
    } 

    return null; 
} 

Luego llame al método anterior en el evento OnPageSelected.

 public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
      Spinner spinner = getTabSpinner(); 
      if (spinner != null) { 
       spinner.setSelection(position); 
      } 
     } 

Referido este post https://gist.github.com/2657485

+0

Hola montones de thnx Wayofhope. Revisaré tu ejemplo y te dejaré saber el progreso. – Android

+0

Hola gracias Way of Hope. Funciona brillantemente. Resolvió mi problema de 5 días. Gracias de nuevo. – Android

+0

¡¡¡Genial !!! Disfruta amigo. –

Cuestiones relacionadas