Después de pasar mucho tiempo y no encontrar una solución adecuada, decidí recurrir a este servicio en busca de ayuda.
Tengo un ejemplo de la aplicación más simple que implementa Drawer . Este ejemplo contiene solo elementos de menú sin ninguna implementación. En el elemento del menú Compartir , agregué un interruptor y un oyente:
main_nav.xml
<item android:id="@+id/nav_share" android:icon="@drawable/ic_menu_share" app:actionViewClass="androidx.appcompat.widget.SwitchCompat" android:title="@string/menu_share" />MainActivity.kt
val menuItem = navigation_view.menu.findItem(R.id.nav_share) val switch_id = menuItem.actionView as SwitchCompat switch_id.isChecked = true switch_id.setOnClickListener { // TODO: empty scope }El interruptor funciona sin problemas y con animación como se muestra a continuación:
Pero ahora necesito apagar el elemento del menú Inicio si el interruptor está apagado :
switch_id.setOnClickListener { navigation_view.menu.findItem(R.id.nav_home).isEnabled = switch_id.isChecked }¡Después de agregar esta línea, mi animación Switch se rompe !
Pasé dos días resolviendo este problema y al final fue en vano.
Mi pregunta: ¿ WTF con el menú de Android en 2021? ¿Por qué acceder a un elemento del menú interrumpe la animación y cómo puedo solucionarlo? Apreciaría cualquier ayuda !!
Creé un problema con esta pregunta en Android Tracker y obtuve una respuesta:
De cualquier manera, es probable que esta sea una solución no trivial para un problema que no es una regresión y que no afecta la corrección de la interfaz de usuario. En este momento, no tenemos planes para abordar el problema.
Y luego se sugirió una solución alternativa:
Algo parecido a agregar un setOnCheckedChangeListener que publica un Runnable retrasado para efectuar el cambio. Recomiendo preguntar en StackOverflow si necesita un ejemplo detallado.
Por ejemplo , ¿cómo retrasar "runOnUiThread" en Android?
Agregué un postDelay(200) y la animación Switch funciona bien:
switch.setOnCheckedChangeListener { _, isChecked -> Handler(Looper.getMainLooper()).postDelayed({ navigationView.menu.findItem(R.id.nav_home).isEnabled = isChecked }, 200) }