Skip to content

Instantly share code, notes, and snippets.

@webserveis
Last active April 28, 2022 11:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save webserveis/53d17c00c297a3a950a5b4bd4217e10e to your computer and use it in GitHub Desktop.
Save webserveis/53d17c00c297a3a950a5b4bd4217e10e to your computer and use it in GitHub Desktop.
ActionMode Primary Android Kotlin

Ejemplo de como implementar un menu en modo edición, cuando mantenemos el toque en un elemento para selecionar y aparezca el menu para eliminar etc...

Versión API min 23

Definir en themes y crear el menü

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

crear el menù de edicion menu_action_edit.xml

Carga del menú adicional

startActionMode(this, ActionMode.TYPE_PRIMARY)

Implementar los callbacks de la interfaz

override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {}

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

override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {}

override fun onDestroyActionMode(mode: ActionMode) {}

Operar con action mode

Inicializar el menú

se especifica el callback y el tipo

startActionMode(this, ActionMode.TYPE_PRIMARY)

Cuando se crea el menú onCreateActionMode es donde se infla el menú de edición y donde obtenemos el actionMode para operar con él

Ooperar con el Action Mode

en onActionItemClicked es donde se captura que elemento del menú se pulsa

Finalizar el menú

actionMode?.finish()

Más info en, https://medium.com/over-engineering/using-androids-actionmode-e903181f2ee3

package com.example.testmenu
import android.os.Bundle
import android.view.ActionMode
import android.view.Menu
import android.view.MenuItem
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import com.example.testmenu.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity(), ActionMode.Callback {
private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var binding: ActivityMainBinding
private var actionMode: ActionMode? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.toolbar)
val navController = findNavController(R.id.nav_host_fragment_content_main)
appBarConfiguration = AppBarConfiguration(navController.graph)
setupActionBarWithNavController(navController, appBarConfiguration)
binding.fab.setOnClickListener { view ->
startActionMode()
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_settings -> true
R.id.action_delete -> {
deleteElements()
true
}
else -> super.onOptionsItemSelected(item)
}
}
override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.nav_host_fragment_content_main)
return navController.navigateUp(appBarConfiguration)
|| super.onSupportNavigateUp()
}
//API min 23
private fun startActionMode() {
startActionMode(this, ActionMode.TYPE_PRIMARY)
}
private fun deleteElements() {
Toast.makeText(this, "delete click", Toast.LENGTH_SHORT).show()
}
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
actionMode = mode
val inflater = mode.menuInflater
inflater.inflate(R.menu.menu_action_edit, menu)
return true
}
override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
return false
}
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_delete -> {
deleteElements()
actionMode?.finish()
true
}
else -> super.onOptionsItemSelected(item)
}
}
override fun onDestroyActionMode(mode: ActionMode?) {
actionMode = null
}
}
<?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="delete"
app:showAsAction="never" />
</menu>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment