2012-08-05 11 views
16

Tengo una Barra de acciones de división, y yo estoy tratando de agregar funcionalidad casi idéntica a la de Google Play 'Reproduciendo' ..Android - Empuje vista personalizada al pie de la pantalla

puedo conseguir elementos de menú a aparecen en la parte inferior de la pantalla, usando onCreateOptionsMenu, pero parece que no puedo obtener una vista personalizada para que aparezca en la parte inferior de la pantalla cuando se usa actionBar.setCustomView. La vista personalizada solo se encuentra debajo de la barra de acciones superior.

¿Alguien sabe cómo forzar la vista personalizada hacia la parte inferior, o agregar vistas personalizadas al onCreateOptionsMenu?

Éstos son los fragmentos de mi código:

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

    ActionBar actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayShowTitleEnabled(true); 
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 

    //Custom view to add 
    actionBar.setCustomView(R.layout.albumitem); 
      //This view shows up just under the top actionbar at the moment, 
       despite menu items being at the bottom 

El código de opciones del menú: (Estos están mostrando hacia abajo la parte inferior donde me gustaría que mi vista personalizada que ser)

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    new MenuInflater(this).inflate(R.menu.option_menu, menu); 

    return (super.onCreateOptionsMenu(menu)); 
} 

I cree que el menú de reproducción en curso en la parte inferior de la aplicación google Play music es una vista personalizada dentro de una barra de acción de división:

Google Play Music

+0

se puede hacer referencia a mi respuesta aquí [fijo Bottombar y Topbar] [1] [1]: http://stackoverflow.com/a/14597289/1627904 – k0sh

Respuesta

17

Así he conseguido encontrar una solución a este sucio .. Bueno, sucia en mi opinión de aficionado ..

En el oncreateOptionsMenu, he inflados un menú llamado option_menu así:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
     new MenuInflater(this).inflate(R.menu.option_menu, menu); 

y en el xml de ese elemento option_menu, he implementado un actionViewClass, y en este caso se ha usado la disposición relativa (supongo que podría haber utilizado simplemente Ver ..?):

<item 
    android:id="@+id/layout_item" 
    android:actionViewClass="android.widget.RelativeLayout" 
    android:showAsAction="always|withText" 
    android:title="Text 1"/> 

</menu> 

Entonces me infla un diseño xml, y ha añadido que a la layout_item definido en mi menú:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     new MenuInflater(this).inflate(R.menu.option_menu, menu); 
     relativeLayout = (RelativeLayout) menu.findItem(R.id.layout_item) 
       .getActionView(); 

     View inflatedView = getLayoutInflater().inflate(R.layout.now_playing, 
       null); 

     relativeLayout.addView(inflatedView); 

     return (super.onCreateOptionsMenu(menu)); 
    } 

No dude en editar/mejorar esta respuesta como mejor le parezca.

+0

Parece que funciona, pero no puedo mostrar iconos en la barra de acciones superior y mi vista personalizada en la barra inferior. ¿También lograste esto? –

+2

No. Recientemente me di cuenta que usar un fragmento en la parte inferior es probablemente mejor. –

+1

Un poco tarde en esto, pero la aplicación de música no usa una barra de acción en absoluto. Tanto la parte superior como la inferior son Vistas personalizadas. – adneal

1

He hecho una solución basada en la tuya, incluyendo diseño personalizado en la parte superior + diseño personalizado en la parte inferior + título/subtítulo + icono de inicio. Aquí está el código:

public class SplitABActivity extends Activity{ 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar ab = getActionBar(); 
    ab.setTitle("Action Bar Title"); 
    ab.setSubtitle("Action Bar Subtitle"); 
    ab.setDisplayShowHomeEnabled(true); 

    LayoutInflater inflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    RelativeLayout layout = (RelativeLayout) inflater.inflate(R.layout.ab_custom_layout, null); 
    ab.setCustomView(layout); 
    ab.setSplitBackgroundDrawable(new ColorDrawable(Color.BLUE)); 
    ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_including_layout, menu); 
    RelativeLayout layout = (RelativeLayout) menu.findItem(R.id.layout_item).getActionView(); 
    View v = getLayoutInflater().inflate(R.layout.ab_bottom_layout, null); 
    layout.addView(v); 

    return super.onCreateOptionsMenu(menu); 
} 
} 

ab_custom_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="right" 
    > 
    <TextView android:id="@+id/element1" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:textColor="#fff" 
     android:background="#ff0000" 
     android:text="Element 1"/> 

    <TextView 
     android:id="@+id/element2" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:textColor="#000" 
     android:background="#f0f0f0" 
     android:layout_toRightOf="@+id/element1" 
     android:text="Element 2"/> 

</RelativeLayout> 

menu_including_layout.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

<item android:id="@+id/action1" 
    android:title="Action 1" 
     android:icon="@android:drawable/ic_dialog_alert" 
     android:showAsAction="ifRoom" /> 

<item android:id="@+id/action2" 
    android:title="Action 2" 
     android:icon="@android:drawable/ic_dialog_info" 
     android:showAsAction="ifRoom" /> 

<item 
android:id="@+id/layout_item" 
android:actionViewClass="android.widget.RelativeLayout" 
android:showAsAction="always|withText" 
android:title="Layout Item"/> 
</menu> 

ab_bottom_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
> 

<TextView 
    android:id="@+id/bottom_layout_txt_status" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Click this button"/> 

<ImageButton android:id="@+id/bottom_layout_btn_chat" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@android:drawable/ic_menu_camera" 
    android:layout_toRightOf="@+id/bottom_layout_txt_status" 
    android:contentDescription="@string/app_name"/> 
</RelativeLayout> 

Código funciona perfecto para mí. Puedo ver la ActionBar dividida cuando mi tableta está en retrato. En el paisaje es lo suficientemente amplia como para almacenar todos los elementos en la parte superior.

creo que sirve

Cuestiones relacionadas