Cómo usar vistas y proveedores de acciones

La biblioteca de AndroidX Toolbar proporciona diferentes formas para que los usuarios interactúen con tu app. En Cómo agregar y manejar acciones, se describe cómo definir una acción, que puede ser un botón o un elemento de menú. En este documento, se describe cómo agregar dos componentes versátiles:

  • Una vista de acción es una acción que proporciona una funcionalidad enriquecida dentro de la barra de la app. Para ejemplo, una vista de acción de búsqueda le permite al usuario escribir el texto de búsqueda en la barra de la aplicación sin que para cambiar actividades o fragmentos.
  • Un proveedor de acciones es una acción con su propio diseño personalizado. La acción inicial aparece como un botón o como un elemento de menú; Cuando el usuario presiona la acción, el proveedor de acciones controla el comportamiento de la acción de la forma que definas. Por ejemplo, el proveedor de acciones podría responder a un toca mostrando un menú.

AndroidX proporciona varias vistas de acción especializadas y widgets de proveedor de acciones. Por ejemplo, el Widget SearchView Implementar una vista de acción para ingresar búsquedas El ShareActionProvider implementa un proveedor de acciones para compartir información con otras apps. También puedes definir tus propias vistas y proveedores de acciones.

Cómo agregar una vista de acción

Para agregar una vista de acción, crea una <item> en el recurso de menú de la barra de herramientas, como se describe en Agrega y controla acciones. Agrega uno de los siguientes atributos al Elemento <item>:

  • actionViewClass: Es la clase de un widget que implementa la acción.
  • actionLayout: Es un recurso de diseño que describe los componentes de la acción.

Establece el atributo showAsAction en "ifRoom|collapseActionView". "never|collapseActionView" La marca collapseActionView indica cómo mostrar el widget cuando el usuario no esté interactuando con él. Si el widget está en la barra de la app, la app muestra el widget como un ícono. Si el widget está en el menú ampliado, la app muestra el widget. como un elemento de menú. Cuando el usuario interactúa con la vista de acción, se expande para llenar la barra de la app.

Por ejemplo, en el siguiente código, se agrega un widget SearchView a la barra de la app:

<item android:id="@+id/action_search"
     android:title="@string/action_search"
     android:icon="@drawable/ic_search"
     app:showAsAction="ifRoom|collapseActionView"
     app:actionViewClass="androidx.appcompat.widget.SearchView" />

Si el usuario no está interactuando con el widget, la app lo muestra como el ícono especificado. de android:icon. Si no hay espacio en la barra de la aplicación, la aplicación agrega la acción a la menú ampliado.

Imagen que muestra una barra de búsqueda con íconos iniciales y finales.
Figura 1: Barra de búsqueda con íconos iniciales y finales.

Cuando el usuario toca el ícono o elemento del menú, el widget se expande para llenar la barra de herramientas, lo que permite que la cuando el usuario interactúa con él.

Imagen que muestra una vista de búsqueda abierta una vez que se enfoca la barra de búsqueda.
Figura 2: La vista de búsqueda se abre cuando se enfoca la barra de búsqueda.

Si necesitas configurar la acción, hazlo en la sección onCreateOptionsMenu() devolución de llamada. Puedes obtener la referencia de objeto de la vista de acción llamando al getActionView() . Por ejemplo, en el siguiente código, se obtiene la referencia del objeto para SearchView. definido en el ejemplo de código anterior:

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.main_activity_actions, menu)

    val searchItem = menu?.findItem(R.id.action_search)
    val searchView = searchItem?.actionView as SearchView

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu)
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_activity_actions, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView =
            (SearchView) searchItem.getActionView();

    // Configure the search info and add any event listeners.

    return super.onCreateOptionsMenu(menu);
}

Cómo responder a la expansión de la vista de acción

Si el elemento <item> de la acción tiene una marca collapseActionView, la La app muestra la vista de acción como un ícono hasta que el usuario interactúa con la vista de acción. Cuando el usuario toca el ícono, el controlador integrado de onOptionsItemSelected() se expande la vista de acción. Si la subclase de tu actividad anula la onOptionsItemSelected(), tu método de anulación debe llamar super.onOptionsItemSelected() para que la superclase pueda expandir la vista de acción.

Si quieres realizar una acción cuando la acción se expande o se contrae, puedes definir una clase implements MenuItem.OnActionExpandListener, y pasar a un miembro de esa clase a setOnActionExpandListener() Por ejemplo, es posible que desees actualizar la actividad en función de si una vista de acción se expande o contraída. En el siguiente fragmento de código, se muestra cómo definir y pasar un objeto de escucha:

Kotlin

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.options, menu)

    // Define the listener.
    val expandListener = object : MenuItem.OnActionExpandListener {
        override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
            // Do something when the action item collapses.
            return true // Return true to collapse the action view.
        }

        override fun onMenuItemActionExpand(item: MenuItem): Boolean {
            // Do something when it expands.
            return true // Return true to expand the action view.
        }
    }

    // Get the MenuItem for the action item.
    val actionMenuItem = menu?.findItem(R.id.myActionItem)

    // Assign the listener to that action item.
    actionMenuItem?.setOnActionExpandListener(expandListener)

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);

    // Define the listener.
    OnActionExpandListener expandListener = new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // Do something when the action item collapses.
            return true;  // Return true to collapse action view.
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when it expands.
            return true;  // Return true to expand the action view.
        }
    };

    // Get the MenuItem for the action item.
    MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);

    // Assign the listener to that action item.
    MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);

    // For anything else you have to do when creating the options menu,
    // do the following:

    return true;
}

Agregar un proveedor de acciones

Para declarar un proveedor de acciones, crea un elemento <item> en el menú de la barra de herramientas. como se describe en Cómo agregar y controlar acciones. Agrega un actionProviderClass y establecerlo en el nombre de clase completamente calificado del clase de proveedor de acciones.

Por ejemplo, el siguiente código declara un ShareActionProvider, que es un widget. definidos en la biblioteca de AndroidX que permite que tu app comparta datos con otras apps:

<item android:id="@+id/action_share"
    android:title="@string/share"
    app:showAsAction="ifRoom"
    app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>

En este caso, no es necesario declarar un ícono para el widget, ya que ShareActionProvider proporciona sus propios gráficos. Si usas una acción personalizada, declarar un ícono.

Recursos adicionales

  • Consulta ShareActionProvider para ver un ejemplo de cómo agregar una acción para compartir a la barra superior de la app.
  • Consulta ActionProvider para y obtén más información para crear un proveedor de acciones personalizadas.