2012-08-24 20 views

Respuesta

79

Cree un diseño para el interruptor switch_layout.xml. diseños personalizados para el menú siempre deben ser RelativeLayout

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <Switch 
     android:id="@+id/switchForActionBar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="" /> 

</RelativeLayout> 

Luego, en su mainmenu.xml agrega el artículo de la siguiente manera

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
     android:id="@+id/myswitch" 
     android:title="" 
     android:showAsAction="always" 
     android:actionLayout="@layout/switch_layout" 
    /> 
</menu> 

Y en su actividad, inflar el mainmenu.xml como haces siempre

getMenuInflater().inflate(R.menu.mainmenu, menu); 
return true; 
+2

Hola para "Los diseños personalizados para el menú siempre deben ser RelativeLayout". ¿Hay algún estado de doc que? – Yeung

+0

Bueno, es verdad. Si cambio a FrameLayout, el interruptor no es fácil de tocar. – Yeung

+0

Si uso LinearLayout todo funciona bien aquí. ¡Gracias por responder! – Erwin

4

La solución dada por Ezequiel es increíble y funciona. Aquí va otro enfoque:

Definir su diseño personalizado:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" > 
    <Switch 
     android:id="@+id/actionbar_switch" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="" /> 
</RelativeLayout> 

inflarlo programáticamente:

ActionBar actionBar = getSupportActionBar(); 
actionBar.setCustomView(R.layout.actionbar_top); 
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_CUSTOM); 
... 
Switch button = (Switch) findViewById(R.id.actionbar_switch); 
+1

¡Guau ... esto resolvió mi problema! Parece que no puedo trabajar con la solución de Ezequiel, ¡pero esta es la solución para mí! Tal vez tiene que ver con la nueva barra de herramientas que estoy usando como ActionBar ??? ¡Gracias de todas formas! NOTA: que esto parece ser diferente de mi enfoque original en el que quería que fuera la vista personalizada de un menú ... pero, ¿hay alguna manera de tener esta vista personalizada alineada a la derecha de la barra de acciones? –

+0

Resolvimos y compartimos la respuesta para aquellos que están en el mismo barco. –

+0

@VuNguyen ¡genial! Todavía estoy lidiando con eso porque tengo este ActionBar dentro de un Fragment, findViewById devuelve null, se actualizará cuando se resuelva: D –

27

finalmente descubrió mi problema: para los que está utilizando el nuevo AppCompat, usted debe utilizar android.support.v7.widget.SwitchCompat en lugar de Switch en el diseño del interruptor ... de lo contrario, no se mostrará en el ActionBar (suponiendo que también está utilizando AppCompat ActionBar), bueno, el atributo actionLayout no funciona, debe configurarse en t el codigo

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/switchView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"> 

    <android.support.v7.widget.SwitchCompat 
     android:id="@+id/switchForActionBar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="" /> 

</RelativeLayout> 

A continuación, establecer el diseño en el código:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    MenuItem item = menu.findItem(R.id.on_off_switch); 
    item.setActionView(R.layout.on_off_switch); 
    return true; 
} 
+1

El uso de 'SwitchCompat' tiene otra ventaja: el interruptor se muestra con un aspecto más reciente (por ejemplo, el diseño del material). – DenisGL

+13

¿Por qué todos usan 'android: orientation =" horizontal "' en RelativeLayout? – zackygaurav

+0

@zackygaurav Como mi prueba, no es necesario usar 'RelativeLayout', estoy usando' LinearLayout' y funciona perfectamente. – drakeet

25

Si el widget no aparece en la barra de acción, es probable que sea porque está utilizando AppCompat para su acción-bar. Para resolver este interruptor "android:" a "app:" frente a "showAsAction" y "actionLayout" en su menu.xml

Añadir artículo a XML, la aplicación: en lugar del androide:

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
      <item 
       android:id="@+id/myswitch" 
       android:title="" 
       app:showAsAction="always" 
       app:actionLayout="@layout/switch_layout" 
      /> 
     </menu> 
diseño

Hacer que está utilizando para su "aplicación: actionLayout"
switch_layout

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 
    <Switch 
     android:id="@+id/switchAB" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     /> 
</RelativeLayout> 

Inflar el menú en su ActionBarActivity como lo haría normalmente

getMenuInflater().inflate(R.menu.mainmenu, menu); 
    return true; 

Esto debería hacer que el interruptor aparezca en su barra de acciones, si no aparecía.

+0

¡Esto es una simplificación/adición sutil pero excelente a las respuestas antedichas! – swooby

+1

Sus pequeños detalles como este que son tan fáciles de supervisar y olvidarse de ajustar. Siempre pasé horas tratando de descubrir que estaba mal. Ahora, si algo no aparece en el menú, tengo una regla práctica para verificar los espacios de nombres. – ChallengeAccepted

+0

Sé que ha sido largo pero esta respuesta funcionó para mí, ahora la pregunta es ¿cómo obtengo el interruptor para poder conectar un oyente programáticamente? –

Cuestiones relacionadas