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:
- Deshabilitar la vista principal no deshabilita automáticamente vistas secundarias. Esto es inconveniente.
- Aunque esté gris, las vistas deshabilitadas todavía pueden enfocarse y obtener entrada de teclado, hacer elecciones, etc. Esto no es correcto.
- 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.
- 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?
- Android Webview goback () problema con el método loadDataWithBaseURL
- ExpandableListView - la indicación de grupo es extensible para ajustarse al tamaño del texto
- Cómo obtener un elemento de un niño en ExpandableListView?
- Expandable ListView
- Establecer un ancho máximo en un grupo de vistas
EDIT: olvidar mencionar el primero.
- ¿Cuál es la diferencia entre getWidth / Height () y getMeasuredWidth / Height () en Android SDK?
- Android ExpandableListView y onChildClick no funciona
- Animación de fondo en Android?
- ¿Cómo evitar que el teclado virtual de Android mueva la vista en un fragmento?
- Cómo cambiar el tamaño de la imagen al pulsar
- Cómo configurar el tamaño de la vista de superficie personalizada
- En un ExpandableListView, ¿cómo detectar el colapso del grupo?
- Android: Estado compartido compartido de vista de niño de su vista principal en Jelly Bean
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
- OSMDroid: Agregar un marcador cuando el usuario teclea en el mapa
- ¿El video de Android VideoView almacenó videos en streaming?