2012-09-12 16 views
5

Me gustaría tener una barra de acciones con navegación personalizada donde las vistas personalizadas se parecen a las pestañas de la barra de acciones estándar. Sé que suena a reinventar la rueda, pero significa que podemos tener el botón de menú en la misma fila que las pestañas, como se muestra a continuación. Este es un requisito de diseño y prácticamente tiene mucho más sentido de interfaz de usuario para esta aplicación que el comportamiento estándar de Android. How I would like the tabs to lookreplicar pestaña (es) de ActionBar con vista personalizada

He intentado usar un IcsLinearLayout de ActionBarSherlock así:

<IcsLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:orientation="horizontal" 
      android:layout_height="50dip"> 
     <Button 
      android:id="@+id/tab_1" 
      android:layout_height="match_parent" 
      android:gravity="center" 
      android:layout_width="wrap_content" 
      android:textStyle="bold" 
      android:text="TAB_1" 
      android:background="@drawable/abs__item_background_holo_light" 
      /> 
     <Button 
      android:id="@+id/tab_2" 
      android:layout_height="match_parent" 
      android:gravity="center" 
      android:layout_width="wrap_content" 
      android:textStyle="bold" 
      android:text="TAB_2" 
      android:background="@drawable/abs__item_background_holo_light" 
      /> 
</IcsLinearLayout> 

Pero que replica ActionButtons y no tengo ni idea de cómo replicar aquí.

Asumo que necesitaré:

  • un contenedor ViewGroup ficha especial (probablemente de la biblioteca ActionBarSherlock)
  • vistas que se parecen a las pestañas con un recurso fondo de la biblioteca de ABS.
  • código para indicar que después de hacer clic en la vista, permanece seleccionado (similar a RadioButton).

Cualquier puntero a muestras o soluciones similares (incluso dentro de la biblioteca ActionBarSherlock) sería muy apreciado.

Respuesta

13

// permitiendo pestañas incrustado

//pre-ICS 
if (actionBarSherlock instanceof ActionBarImpl) { 
    enableEmbeddedTabs(actionBarSherlock); 

//ICS and forward 
} else if (actionBarSherlock instanceof ActionBarWrapper) { 
    try { 
     Field actionBarField = actionBarSherlock.getClass().getDeclaredField("mActionBar"); 
     actionBarField.setAccessible(true); 
     enableEmbeddedTabs(actionBarField.get(actionBarSherlock)); 
    } catch (Exception e) { 
     Log.e(TAG, "Error enabling embedded tabs", e); 
    } 
} 

//helper method 
private void enableEmbeddedTabs(Object actionBar) { 
    try { 
     Method setHasEmbeddedTabsMethod = actionBar.getClass().getDeclaredMethod("setHasEmbeddedTabs", boolean.class); 
     setHasEmbeddedTabsMethod.setAccessible(true); 
     setHasEmbeddedTabsMethod.invoke(actionBar, true); 
    } catch (Exception e) { 
     Log.e(TAG, "Error marking actionbar embedded", e); 
    } 
} 

este código funciona perfectamente. Lo intenté en mi aplicación. para referencia futura - https://groups.google.com/forum/#!topic/actionbarsherlock/hmmB1JqDeCk

+0

¡Funciona bien! Al igual que una nota, descubrí que es necesario hacerlo antes de configurar el resto de las pestañas de la barra de acciones, etc. – DavidBriggs

5

Al usar el visor de jerarquía, creo que hemos resuelto cómo hacerlo. Resulta que no fue difícil en absoluto. Necesita un ScrollingTabContainerView de la biblioteca de ABS y puede agregar pestañas a eso.

How it all looks with tabs on a narrow action bar

public class MainActivity extends SherlockActivity implements ActionBar.TabListener { 
/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ScrollingTabContainerView root = new ScrollingTabContainerView(this); 
    ActionBar.Tab tab1 = getSupportActionBar().newTab(); 
    tab1.setText("TAB 1"); 

    tab1.setTabListener(this); 

    ActionBar.Tab tab2 = getSupportActionBar().newTab(); 
    tab2.setText("TAB 2"); 
    tab2.setTabListener(this); 

    root.addTab(tab1, 0, true); 
    root.addTab(tab2, 1, false); 

    getSupportActionBar().setCustomView(root); 
    getSupportActionBar().setDisplayShowCustomEnabled(true); 
    getSupportActionBar().setTitle("App Title"); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu){ 
    menu.add("MENU ITEM 1"); 
    menu.add("MENU ITEM 2"); 
    return true; 
} 

@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
    //To change body of implemented methods use File | Settings | File Templates. 
} 

@Override 
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { 
    //To change body of implemented methods use File | Settings | File Templates. 
} 

@Override 
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { 
    //To change body of implemented methods use File | Settings | File Templates. 
} 

espero que esto ayude a alguien.

+0

gracias por la respuesta. fue realmente útil :) Enfrentando un pequeño problema técnico. Implementé el buscador de páginas para pestañas. ahora cuando arrojo el fragmento, obtengo la fuerza cerrada porque la vista personalizada no tiene setSelectedNavigationItem (position); definido. cualquier trabajo para eso? – nia

+0

esto no funciona en ICS y jellybean :(¿hay trabajo alrededor para eso? – nia

+0

Hmmm. No he tenido tiempo de analizar esto desde la semana pasada pero veré lo que puedo hacer. – DavidBriggs

Cuestiones relacionadas