2012-03-27 26 views
22

seleccionaron inicialmente me he dado cuenta que cuando se utilizapestañas Android actionbar conjunto de pestañas

actionBar.setSelectedNavigationItem(x) 

en el método onCreate() de mi actividad, el elemento de ficha en la posición 0 se selecciona siempre primero y luego el elemento de ficha en la posición x está cargado. Esto significa que (ya que estoy usando Fragmentos) 2 Fragmentos están cargados. Una de ellas es innecesaria ...

Aquí está mi código:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Determine which bundle to use; either the saved instance or a bundle 
    // that has been passed in through an intent. 
    Bundle bundle = getIntent().getExtras(); 
    if (bundle == null) { 
     bundle = savedInstanceState; 
    } 

    // Initialize members with bundle or default values. 
    int position; 
    if (bundle != null) { 
     position = bundle.getInt("selected_tab"); 
    } else { 
     position = 0; 
    } 

    // Set the tabs. 
    ActionBar actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    Tab tab = actionBar 
      .newTab() 
      .setText("Tab 1") 
      .setTabListener(
        new TabListener<RendersGridFragment>(this, "1", 
          RendersGridFragment.class)); 
    actionBar.addTab(tab); 

    tab = actionBar 
      .newTab() 
      .setText("Tab 2") 
      .setTabListener(
        new TabListener<RendersGridFragment>(this, "2", 
          RendersGridFragment.class)); 
    actionBar.addTab(tab); 

    tab = actionBar 
      .newTab() 
      .setText("Tab 3") 
      .setTabListener(
        new TabListener<RendersGridFragment>(this, "3", 
          RendersGridFragment.class)); 
    actionBar.addTab(tab); 

    actionBar.setSelectedNavigationItem(position); 
} 

Parece que la lengüeta en la posición 0 se selecciona inicialmente por defecto. Pero, como puede ver, estoy transfiriendo paquetes para asegurarme de que la última pestaña seleccionada todavía esté seleccionada cuando se ejecute nuevamente la actividad en el método Crear().

Por ejemplo, si la última pestaña seleccionada está en la posición 2, se ejecuta onCreate() y se carga la pestaña en la posición 0, se carga la pestaña en la posición 2.

¿Cómo puedo asegurarme de que la Barra de acciones no selecciona la pestaña en la posición 0 primero cuando se utiliza actionBar.setSelectedNavigationItem (posición).

Respuesta

34

Utilice las otras llamadas addTab para anular este comportamiento. Deberá agregar primero la pestaña que desea seleccionar (en su caso, la pestaña en la posición 2). Relevant Javadoc

actionBar.addTab(tab2); 
actionBar.addTab(tab0, 0, false); 
actionBar.addTab(tab1, 1, false); 
+0

Eso es perfecto. Pensé que había una solución simple. Gracias. – mdupls

+0

Funciona, pero puedo ver la transición de ViewPager cuando se crea la actividad. ¿Hay alguna manera, cómo desactivarlo? – sealskej

+0

No estoy seguro si tuve el mismo problema que el autor de la pregunta. En mi caso, la función setSelectedNavigationItem (...) cuando se llamaba onCreate of my Activity, el fragmento se instanciaba dos veces o más. Cambiar para esto resuelve mi problema. Gracias. –

3

puede utilizar a continuación DECLARACIÓN en activtiy onStart método:

protected void onStart() { 
    super.onStart(); 
    actionBar.selectTab(mainTab); 
} 

donde mainTab variable aquí es del tipo Tab. esta manera es necesario definir las pestañas como variables de toda la clase como esta:

Tab mainTab, tab2,tab3; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //add tabs to action bar 
    .... 
} 
2

Si usted tiene 3 pestañas (es decir, 0 pestaña, pestaña 1, ficha 2) y desea pestaña 1 para ser preseleccionado. Haga lo siguiente:

for (int i = 0; i < mFragmentPagerAdapter.getCount(); i++) { 
    boolean preselected = (i == 1); 
    actionBar.addTab(actionBar.newTab().setText(
     mFragmentPagerAdapter.getPageTitle(i)).setTabListener(this), preselected); 
} 

Usted va a utilizar:

public abstract void addTab (ActionBar.Tab tab, boolean setSelected) 

según this API specification.

0

La respuesta de bkurzius me ayudó a solucionar un problema que estaba teniendo con el mismo problema.

Lo que hice fue:

private final String TAB_SELECTED = "tab_selected" 
... 
private int mTabSelected; 
... 
mTabSelected = savedInstanceState.getInt(TAB_SELECTED); 
... 
final ActionBar actionbar = getActionBar(); 
... 
actionbar.addTab(tab1, mTabSelected == 0); 
actionbar.addTab(tab2, mTabSelected == 1); 
actionbar.addTab(tab3, mTabSelected == 2); 
... 
outState.putInt(TAB_SELECTED, getActionBar().getSelectedNavigationIndex()); 

De esta manera, el parámetro setSelected es cierto sólo si mTabSelected es igual al índice de la ficha.

+0

Su mTabSelected debe ser un int y no un booleano. – mdupls

+0

¡Uy, copiado tarde en la noche! Es un int. Gracias. Edición... –

0

La respuesta de Percy Vega parece ser la mejor solución de trabajo.

for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 

     boolean preselected = (i == ErrorDetails.tab_id); 
     actionBar.addTab(
       actionBar.newTab() 
         .setText(mSectionsPagerAdapter.getPageTitle(i)) 
         .setTabListener(this),preselected); 
    } 
Cuestiones relacionadas