Barra de herramientas y Barra de acción contextual con AppCompat-v7


Estoy trabajando en usar la barra de herramientas recién agregada que se introdujo en Lollipop y la biblioteca AppCompat-v7. Seguí esta guía al configurar la barra de herramientas noté que cuando invoca algo que mostrará la barra de acción contextual (como resaltar texto para copiar/pegar), empujará la Barra de herramientas hacia abajo en la página. Puedes ver de lo que estoy hablando en la imagen en la parte inferior de la página:

Así que, esencialmente, lo configuré así. Tengo el Barra de herramientas definida en un archivo xml que utilizo con las etiquetas include:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"/>

Entonces, lo instancio en mi opinión:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/root"
    tools:context=".MainActivity">

    <include
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/> 

    <!-- Rest of view -->

    </LinearLayout>

En código, lo configuré así:

    // On Create method of activity:
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

¿Alguien sabe cómo hacer que la Barra de acción Contextual se superponga a la Barra de herramientas?

Barra de herramientas y Barra de acción contextual

Author: MrEngineer13, 2014-10-18

7 answers

Actualización:

Solución: utilice la propiedad windowActionModeOverlay. Establezca esto en su tema:

<item name="windowActionModeOverlay">true</item>

Y el modo de acción se mostrará sobre la barra de acciones en lugar de empujarla hacia abajo. (Si no está utilizando la última AppCompat, debe agregar el prefijo" android: "a la propiedad). Básicamente le permite a AppCompat saber que tiene una barra de herramientas ubicada en la parte superior de la pantalla y que debe dibujar el modo de acción en la parte superior de la misma.


Antiguo respuesta/solución:

Me encontré con el mismo problema. No importa qué tema establezca, siempre empuja hacia abajo la barra de herramientas que establezco como Barra de acción. Lo intenté con y sin la biblioteca de soporte, pero no importaba.

Desafortunadamente no pude arreglarlo, así que he construido una solución alternativa en su lugar. En mis ActionModeCallback's onCreateActionMode escondo la barra de acciones:

actionBarToolbar.setVisibility(View.GONE);

Y en onDestroyActionMode lo muestro de nuevo:{[14]]}

actionBarToolbar.setVisibility(View.VISIBLE);

El ocultar/mostrar sucede tan rápidamente que no se nota en mis dispositivos de prueba. Alli es, por supuesto, un inconveniente: aunque la animación de entrada todavía funciona, la animación de salida de la barra de acciones contextuales se pierde porque la barra de herramientas aparece inmediatamente sobre ella. Pero hasta que encontremos una solución mejor, supongo que estamos atascados con esto.


(Mi Actividad en realidad está extendiendo una clase personalizada BaseActivity que tiene un método llamado getActionBarToolbar(), tomado del código fuente de la aplicación Google I/O 2014 , por lo que puedo obtener fácilmente obtener la barra de herramientas:

BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);

Lástima que la aplicación de E/S lo haga no utilice la barra de acciones contextuales.)

 312
Author: Jacob Ras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-26 13:07:13

No lo inicie en su actividad, sino en su barra de herramientas. En su actividad:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)

Y tienes que usar

<item name="windowActionModeOverlay">true</item>
 14
Author: Frank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-08 09:15:59

Solo una pequeña adición: Para

<item name="windowActionModeOverlay">true</item>
para trabajar es importante llamar super.onCreate(savedInstanceState) ANTES de llamar a setContentView(R.layout.your_activity) en tu actividad. Realmente hace una diferencia en este caso!
 12
Author: Daniel Veihelmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-03 16:23:59

En mi caso, <item name="windowActionModeOverlay">true</item> no funcionó, pero este trabajo:<item name="android:windowActionModeOverlay">true</item>,el android es la clave.

 9
Author: Jenkyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-25 16:20:08

La solución de Jacob funcionó para mí, pero la barra de acción contextual era transparente y la barra de herramientas visible a través de ella. Esto se puede resolver de la siguiente manera:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    ....
    ....
    <item name="actionModeStyle">@style/CustomActionMode</item>
</style>

<style name="CustomActionMode" parent="@style/Widget.AppCompat.ActionMode">
    <item name="background">@color/primary_material_light</item>
</style>

El tema " AppTheme.Base " debe ser el aplicado a la barra de herramientas.

Más detalles sobre el estilo contextual de la barra de acción:

Cómo Personalizar la Barra de Acciones Contextuales usando AppCompat en material design

 8
Author: Pete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:20

Método muy útil para llevar la barra de herramientas al frente toolbar.bringToFront()

 0
Author: kunal.c,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-16 09:25:20

Otra pequeña adición: asegúrese de establecer al menos una pantalla vacía en la actividad a través de setContentView(R.layout.empty_screen) si carga toda la interfaz de usuario en fragmentos (ft.replace(android.R.id.content, fragment)).

 0
Author: Andreas Wenger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-23 18:24:48