2012-03-11 10 views
35

Estoy usando una vista personalizada para ActionBar con pestañas. Mi problema es ordenar la vista personalizada. Android lo muestra DESPUÉS las pestañas, que no quiero.¿Cómo personalizar Android ActionBar para mostrar una vista personalizada antes de las pestañas?

Quiero que se muestre la vista personalizada ANTES las pestañas.

¿Hay alguna manera de personalizar la barra de acciones para mostrar la vista personalizada antes de las pestañas? ¿O esto no es posible?

Código:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    final ActionBar bar = getActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    View customActionBarView = 
     getLayoutInflater().inflate(R.layout.home_actionbar, null, true); 
    ActionBar.LayoutParams lp = 
     new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT); 

    lp.gravity = Gravity.START; 
    bar.setCustomView(customActionBarView, lp); 
    bar.setLogo(R.drawable.logo); 
    bar.setHomeButtonEnabled(true); 
    bar.setDisplayShowCustomEnabled(true); 

    bar.addTab(bar.newTab() 
     .setText("Stuff") 
     .setTabListener(new TabListener<StuffFragment>(
      this, "stuff", StuffFragment.class))); 

    bar.addTab(bar.newTab() 
     .setText("Friends") 
     .setTabListener(new TabListener<ContactsFragment>(
      this, "friends", ContactsFragment.class))); 

    bar.addTab(bar.newTab() 
     .setText("Messages") 
     .setTabListener(new TabListener<ConversationsFragment>(
      this, "messages", ConversationsFragment.class))); 

    if (savedInstanceState != null) { 
     bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
    } 

    bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | 
     ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO); 

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
} 

enter image description here

+0

Tendremos que ver algo de código. Además, deberías tratar de ser más claro sobre lo que quieres decir con "antes" y "después". Capitalizarlos no hace que las cosas sean más cristalinas. – adneal

+0

actualizado con el código y el diagrama –

+2

He buscado en todas partes. parece que no hay control sobre cómo se posiciona cada elemento (logotipo, pestañas, vista personalizada y menús) en la barra de acciones. fml! –

Respuesta

0

Cuando se agrega la vista personalizada a la Barra de acciones se puede especificar la gravedad también.

ActionBar.LayoutParams lp = new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);    
lp.gravity = Gravity.LEFT; 
customView.setLayoutParams(lp); 
+0

i ' He probado muchas soluciones diferentes, incluida la anterior, sin éxito. en su lugar, he decidido abandonar la barra de acción e implementar algo completamente personalizado. –

+0

Entonces, ¿por qué rechazarlo si no puede hacerlo funcionar? Mi respuesta fue correcta, – Lee

0

uso ActionBarSherlock, que es muy buena aplicación de la Barra de acciones a medida para todas las versiones de Android y muy fácil de usar.

o puede crear su propia barra de acciones utilizando la barra de título personalizada y es bastante fácil de implementar. Puede ver this y this ejemplos son muy buenos ejemplos de barras de título personalizadas.

3

Este parece ser el comportamiento previsto al usar pestañas y vistas personalizadas. https://code.google.com/p/android/issues/detail?id=36191#c3

Si echa un vistazo a ActionBarSherlock - Tabs appearing ABOVE actionbar with custom view muchas otras personas también están experimentando esto y algunas personas han ofrecido soluciones.

No he podido conseguir que ninguna de las soluciones funcione, pero pueden funcionar para usted. El truco parece ser asegurarse de que el logotipo no esté configurado para ocultarse. Llame a
getActionBar().setDisplayShowHomeEnabled(true) o getSupportActionBar().setDisplayShowHomeEnabled(true) si usa ActionBarSherlock.

luego llamar a:

View homeIcon = findViewById(
    Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
    android.R.id.home : R.id.abs__home); 
((View) homeIcon.getParent()).setVisibility(View.GONE); 
((View) homeIcon).setVisibility(View.GONE); 

Esto hará que una referencia a la vista actionbar que contiene el logotipo y lo establece como ido con habilita la vista personalizada para llenar toda la vista padre, sino que debe mantener las pestañas debajo ...

Como he dicho, no he podido hacer que funcione, pero algunas personas han tenido éxito.

Buena suerte.

+0

Esto está exactamente en el espíritu de hackear la barra de acción. Excelente sugerencia, funcionó! – foxx1337

2

Tuve el mismo problema y resolví una forma de resolverlo. No es una solución "elegante", pero fue lo mejor que pude encontrar. Como lo primero es que desea modificar el comportamiento estándar de ActionBar, debe forzar a ActionBar Sherlok a usar siempre la implementación no nativa. para hacer eso ActionBarSherlok.java abierta y comentar esta línea de código:

registerImplementation(ActionBarSherlockNative.class); 

entonces retirar todos los valores-V14-V11 valores etc y sea seguro para extender siempre Theme.Sherlock y nunca Tema.Holo

En este punto, está seguro de que la implementación de ActionBar es siempre la escrita por Jake Wharton. Lo único que queda por hacer es hacer que el diseño de la vista de ActionBar tenga la forma que desee. abierto ActionBarView.java y en el OnLayout() método de mover esta pieza de código

if (mExpandedActionView == null) { 
     final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE && 
       (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0; 
     if (showTitle) { 
      x += positionChild(mTitleLayout, x, y, contentHeight); 
     } 

     switch (mNavigationMode) { 
      case ActionBar.NAVIGATION_MODE_STANDARD: 
       break; 
      case ActionBar.NAVIGATION_MODE_LIST: 
       if (mListNavLayout != null) { 
        if (showTitle) x += mItemPadding; 
        x += positionChild(mListNavLayout, x, y, contentHeight) + mItemPadding; 
       } 
       break; 
      case ActionBar.NAVIGATION_MODE_TABS: 
       if (mTabScrollView != null) { 
        if (showTitle) x += mItemPadding; 
        x += positionChild(mTabScrollView, x, y, contentHeight) + mItemPadding; 
       } 
       break; 
     } 
    } 

justo antes de esta pieza

if (mProgressView != null) { 
     mProgressView.bringToFront(); 
     final int halfProgressHeight = mProgressView.getMeasuredHeight()/2; 
     mProgressView.layout(mProgressBarPadding, -halfProgressHeight, 
       mProgressBarPadding + mProgressView.getMeasuredWidth(), halfProgressHeight); 
    } 

Usted está! Espero que esto ayude

0

¿Estás haciendo una aplicación para la tableta? Por lo que yo sé, la barra de pestañas de la barra de acciones básicamente aparece debajo de ella en el teléfono celular.
Si está en la tableta, me temo que no puede ajustar las posiciones de las pestañas. Lo que sí puedo pensar es que debe dejar de usar el modo de navegación y crear una vista personalizada que se asemeje a pestañas para reemplazar las pestañas de ActionBar. Por supuesto, esto provoca un gran esfuerzo adicional para lidiar con la navegación.

0

Simplemente cree una vista personalizada para su botón de inicio. En esta vista, puede combinar el logotipo y la vista personalizada que está tratando de ubicar a la izquierda. A continuación, añadir pestañas de forma normal

El único inconveniente de esta solución es que se necesita para mantener el estado del botón de regreso a ti mismo (si lo usa en absoluto)

0

Primer conjunto "DisplayShowHomeEnabled" propiedad de actionbar a "verdadero": actionBar.setDisplayShowHomeEnabled (true);

y luego:

View homeIcon = findViewById(android.R.id.home); 
     ((View) homeIcon.getParent()).setVisibility(View.GONE); 
     ((View) homeIcon).setVisibility(View.GONE); 

espero que ayude :)

Cuestiones relacionadas