View.setEnabled (false) no funciona muy bien en android

Acabo de descubrir que View.setEnabled (false) no funciona muy bien en android, de las siguientes maneras:

  1. Deshabilitar la vista principal no deshabilita automáticamente vistas secundarias. Esto es inconveniente.
  2. Aunque esté gris, las vistas deshabilitadas todavía pueden enfocarse y obtener entrada de teclado, hacer elecciones, etc. Esto no es correcto.
  3. Al obtener la entrada del teclado, DEL / BACK sólo puede quitar una tecla hacia atrás sin importar cuántas entradas. Este comportamiento sólo se muestra en deshabilitado EditText.
  4. La etiqueta de la radio está en gris, pero la imagen del botón de radio no está en gris.

Parece un error. Pero, ¿cómo puedo obtener una característica real de DISABLE?

EDIT: olvidar mencionar el primero.

De forma recursiva, establecer todos los descendientes es necesario, de lo contrario RadioButtons en el diseño no se setEnabled porque RadioButtons son nietos no niños directos, hay RadioGroup en el medio. Grabo mi mejor solución hasta ahora aquí basada en la respuesta de otros.

public static void setEnabledAll(View v, boolean enabled) { v.setEnabled(enabled); v.setFocusable(enabled); if(v instanceof ViewGroup) { ViewGroup vg = (ViewGroup) v; for (int i = 0; i < vg.getChildCount(); i++) setEnabledAll(vg.getChildAt(i), enabled); } } 

La subclase no funciona en este momento. Si tengo:

 public MyView class View { protected void setEnabled(boolean enabled, boolean setChildren){ setEnabled(enabled); setFocusable(enabled); if(setChildren && this isinstanceof ViewGroup){ for ( int i = 0 ; i < this.getChildCount() ; i++ ) //this line will have issue if it is not MyView this.getChildAt(i).setEnabled(enabled, true); } } } 

A menos que View sí mismo tenga esto sobrecargado setEnabled como este:

 public class View { protected void setEnabled(boolean enabled, boolean setChildren){ setEnabled(enabled); setFocusable(enabled); if(setChildren && this isinstanceof ViewGroup){ for ( int i = 0 ; i < this.getChildCount() ; i++ ) this.getChildAt(i).setEnabled(enabled, true); } } } 

Esta solución eliminará los problemas 1, 2, 3. El problema 4 se puede solucionar estableciendo el selector de estilo deshabilitado para RadioGroup – No estoy seguro de por qué android no tiene un selector de estilo deshabilitado por defecto para RadioGroup. Tal vez otro punto para la mejora de Android. Android es muy flexible en el diseño de SDK también significa a veces el trabajo adicional necesario.

De memoria, por favor disculpe los errores tipográficos:

 class ExtendedLinearLayout extends LinearLayout{ protected void setEnabled(boolean enabled, boolean setChildren){ super.setEnabled(enabled); if(setChildren){ for ( int idx = 0 ; idx < this.getChildCount() ; idx++ ) { (View)(this.getChildAt(idx)).setEnabled(enabled); } } } } 

No tengo respuesta a todas sus preguntas pero intentaré por first y second

  • 1 Su absolutamente bien a no deshabilitar al niño en la inhabilitación del padre. Considere un caso en el que desea hacer clic en el botón de un diseño, pero no desea hacer clic en el área exterior. El mejor ejemplo en Listrow, tiene el botón que desea hacer clic pero no quiere hacer clic en fila.

    Deshabilitar a todos los niños a la vez

     LinearLayout layout = (LinearLayout) findViewById(R.id.my_layout); for (int i = 0; i < layout.getChildCount(); i++) { View child = layout.getChildAt(i); child.setEnabled(false); } 
  • 2 Su happend solamente para EditText pero usted puede pararlo también. Y view.setFocusable(false); Es el correcto para detener la vista de ganar foco

  • Android WebView ZoomManager.onSizeChanged NullPointerException
  • Los métodos getTop (), getLeft (), getX (), getY (), getWidth (), getHeight () de la vista de Android
  • Cómo eliminar el espacio específico entre el padre y el niño en un ExpandableListView
  • ¿Qué pasa con setScaleX / setScaleY?
  • Android expandablelistview, expanda la vista sólo al hacer clic en el indicador de grupo, abra una nueva actividad si hace clic en cualquier lugar, pero groupindicator
  • ¿Cómo crear Clone-Duplicate View?
  • Retener completamente WebView en fragmento tras rotación
  • Android: agrega la vista al diseño haciendo que el diseño esté delante de ActionBar
  • Animación de la traducción y ampliación de la vista en Android
  • Vista flotante en la pantalla de Android
  • Vista de arrastrar androide lisa
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.