ActionMode Android en Kotlin


ActionMode representa un modo contextual de la interfaz de usuario. Los modos de acción se pueden usar para proporcionar modos de interacción alternativos y reemplazar partes de la interfaz de usuario normal hasta que finalice.

Ejemplos de buenos modos de acción incluyen selección de texto y acciones contextuales.

Preparativos

Preparar el menú que se debe mostrar en modo actionMode y en themes.xml añadir

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

contenido del menu_action_edit.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.testmenu.MainActivity">
    <item
        android:id="@+id/action_delete"
        android:orderInCategory="100"
        android:title="@string/action_delete"
        android:icon="@drawable/ic_baseline_delete_24"
        app:showAsAction="never" />
</menu>

Crear classe PrimareActionMode.kt

import android.view.ActionMode
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.annotation.MenuRes

class PrimaryActionMode : ActionMode.Callback {

    interface ActionModeCallback {
        fun onActionItemClicked(item: MenuItem)
    }

    private var callback: ActionModeCallback? = null
    fun setOnActionModeCallback(callback: ActionModeCallback) {
        this.callback = callback
    }

    private var actionMode: ActionMode? = null

    var isActionMode: Boolean = false

    @MenuRes
    private var menuResId: Int = 0
    private var title: String? = null
    private var subtitle: String? = null

    fun startActionMode(view: View, @MenuRes menuResId: Int, title: String? = null, subtitle: String? = null) {
        this.menuResId = menuResId
        this.title = title
        this.subtitle = subtitle
        view.startActionMode(this)
    }

    fun setTitle(title: String?) {
        actionMode?.title = title
    }

    fun setSubtitle(subtitle: String?) {
        actionMode?.subtitle = subtitle
    }

    fun finishActionMode() {
        actionMode?.finish()
        isActionMode = false
    }

    override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
        this.actionMode = mode
        mode.menuInflater?.inflate(menuResId, menu)
        mode.title = title
        mode.subtitle = subtitle
        isActionMode = true
        return true
    }

    override fun onPrepareActionMode(mode: ActionMode?, menu: Menu): Boolean {
        return true
    }


    override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
        callback?.onActionItemClicked(item)
        //mode.finish()
        return true
    }

    override fun onDestroyActionMode(mode: ActionMode) {
        this.actionMode = null
        isActionMode = false
    }

}

Implementación

En la vista donde queremos mostrar el ActionMode

class MainActivity : AppCompatActivity(), PrimaryActionMode.ActionModeCallback
...
private val mActionMode = PrimaryActionMode()
...
override fun onCreate(savedInstanceState: Bundle?) {
...
if (savedInstanceState != null && savedInstanceState.getBoolean("ActionMode", false)) {
    startActionMode(binding.root)
}
...
override fun onSaveInstanceState(outState: Bundle) {
    outState.putBoolean("ActionMode", mActionMode.isActionMode)
    super.onSaveInstanceState(outState)
}
...
private fun startActionMode(view: View) {
    mActionMode.startActionMode(view, R.menu.menu_action_edit, "Selected 1")
    mActionMode.setOnActionModeCallback(this)
}

private fun deleteElements() {
    Toast.makeText(this, "delete click", Toast.LENGTH_SHORT).show()
}

override fun onActionItemClicked(item: MenuItem) {
    when (item.itemId) {
        R.id.action_delete -> {
            deleteElements()
            mActionMode.finishActionMode()
        }
    }
}

Para inicializar el actionmode

startActionMode(view)

Demostración en vídeo

Publicado por Codelaby

Mobile DevDesigner

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: