toma - ¿Cómo agregar un interruptor a la barra de acción de Android?
como instalar un interruptor mixto (4)
Me gustaría agregar un botón de cambio similar al aspecto nativo de jellybean. (Interruptor azul / gris en la parte superior de la vista)
La documentación muestra cómo crear un menú allí o agregar iconos, pero no dice cómo agregar elementos personalizados. p.ej. Un interruptor. http://developer.android.com/guide/topics/ui/actionbar.html
Finalmente descubrí mi problema: para aquellos que usan el nuevo AppCompat, deberían usar android.support.v7.widget.SwitchCompat
vez de Switch
el diseño del interruptor ... de lo contrario, no se mostrará en el ActionBar
(se supone que está usando AppCompat ActionBar también), bueno, el atributo actionLayout no funciona, tiene que estar configurado en el código.
<?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>
Luego configura 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;
}
La solución dada por Ezequiel es asombrosa y funciona. Aquí hay otro enfoque:
Define tu 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);
Si el widget no aparece en la barra de acciones, probablemente se deba a que está utilizando appCompat para su barra de acciones. Para resolver este cambio, "android:" a "aplicación:" frente a "showAsAction" y "actionLayout" en tu menú.xml
Agregue el elemento a xml, con la aplicación: en lugar de Android:
<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>
Haz el diseño que estás usando para tu "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>
Infle 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.
Cree un diseño para el interruptor switch_layout.xml
. Los 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
agregue el elemento 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, infle el mainmenu.xml
como siempre lo hace
getMenuInflater().inflate(R.menu.mainmenu, menu);
return true;