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

  • Cómo obtener un enum que se crea en attrs.xml en el código
  • Cómo crear un grupo de vistas personalizado en android con el ejemplo
  • Cómo obtener la altura de la vista dentro del adaptador para crear bitmap de tamaño?
  • Girar un diseño y después de colocar en relativoLayout prblem
  • Creación de un libro que almacena la vista de cuadrícula en android
  • FilePicker desde android webview trabajando sólo una vez
  • ¿Cuál es la manera correcta de ampliar EditText para darle funcionalidad adicional "predeterminada"
  • RemoveView no funciona después de LayoutInflater.inflate (resource, root, true)
  • android setAlpha lento
  • Diferencia entre vista y subvista - Android
  • Android - listview obtener la vista del artículo por posición
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.