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)