¿Cómo puedo desactivar todas las vistas dentro del diseño?

Por ejemplo, tengo:

 

¿Hay alguna manera de desactivar (setEnable (false)) todos los elementos dentro de LinearLayout my_layout ?

Otra forma es llamar a setEnabled () en cada elemento secundario (por ejemplo, si desea realizar una comprobación adicional en el elemento secundario antes de desactivarlo)

 LinearLayout layout = (LinearLayout) findViewById(R.id.my_layout); for (int i = 0; i < layout.getChildCount(); i++) { View child = layout.getChildAt(i); child.setEnabled(false); } 

este es recursivo para ViewGroups

 private void disableEnableControls(boolean enable, ViewGroup vg){ for (int i = 0; i < vg.getChildCount(); i++){ View child = vg.getChildAt(i); child.setEnabled(enable); if (child instanceof ViewGroup){ disableEnableControls(enable, (ViewGroup)child); } } } 

La respuesta de tutu está en el camino correcto, pero su recursión es un poco incómoda. Creo que esto es más limpio:

 private static void setViewAndChildrenEnabled(View view, boolean enabled) { view.setEnabled(enabled); if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; for (int i = 0; i < viewGroup.getChildCount(); i++) { View child = viewGroup.getChildAt(i); setViewAndChildrenEnabled(child, enabled); } } } 

En realidad, lo que funciona para mí es:

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 

y deshacerlo:

 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 

Cambiemos el código de tütü

 private void disableEnableControls(boolean enable, ViewGroup vg){ for (int i = 0; i < vg.getChildCount(); i++){ View child = vg.getChildAt(i); if (child instanceof ViewGroup){ disableEnableControls(enable, (ViewGroup)child); } else { child.setEnabled(enable); } } } 

Creo que no tiene sentido simplemente deshabilitar viewgroup. Si quieres hacerlo, hay otra forma que he usado exactamente para el mismo propósito. Crear vista como un hermano de su vista de grupo:

  

y en el tiempo de ejecución, hazlo visible. Nota: el diseño principal de su vista de grupo debe ser relativo o de diseño de cuadros. Espero que esto ayude

Si algún desarrollador desesperado se desplaza hacia abajo aquí, tengo otra opción para hacerlo. Lo cual también deshabilita el desplazamiento por lo que experimenté con él. La idea es usar el elemento View como este en RelativeLayout, debajo de todos sus elementos de UI.

  

Por lo tanto, está configurado para “desaparecer” antes de alguna condición. Y luego establece su visibilidad a VISIBLE cuando desea deshabilitar su UI. También debe implementar OnClickListener para esta Vista. Este onClickListener evento click y no lo pasará a los elementos subyacentes.

  private void disableLL(ViewGroup layout){ for (int i = 0; i < layout.getChildCount(); i++) { View child = layout.getChildAt(i); child.setClickable(false); if (child instanceof ViewGroup) disableLL((ViewGroup) child); } } 

y llame al método de esta manera:

 RelativeLayout rl_root = (RelativeLayout) findViewById(R.id.rl_root); disableLL(rl_root); 

Use la función recursiva siguiente para hacer que las vistas de su hijo sean visibles o no. El primer argumento es su vista principal y el segundo argumento decide si desea que los elementos secundarios de la vista principal se vean o desaparezcan. verdadero = visible falso = ido

 private void layoutElemanlarininGorunumunuDegistir(View view, boolean gorunur_mu_olsun) { ViewGroup view_group; try { view_group = (ViewGroup) view; Sabitler.konsolaYazdir(TAG, "View ViewGroup imiş!" + view.getId()); } catch (ClassCastException e) { Sabitler.konsolaYazdir(TAG, "View ViewGroup değilmiş!" + view.getId()); return; } int view_eleman_sayisi = view_group.getChildCount(); for (int i = 0; i < view_eleman_sayisi; i++) { View view_group_eleman = view_group.getChildAt(i); if (gorunur_mu_olsun) { view_group_eleman.setVisibility(View.VISIBLE); } else { view_group_eleman.setVisibility(View.GONE); } layoutElemanlarininGorunumunuDegistir(view_group_eleman, gorunur_mu_olsun); } } 

Aunque no es lo mismo que deshabilitar vistas dentro de un diseño, vale la pena mencionar que puede evitar que todos los niños reciban toques (sin tener que volver a generar la jerarquía de diseño) anulando el método ViewGroup # onInterceptTouchEvent (MotionEvent) :

 public class InterceptTouchEventFrameLayout extends FrameLayout { private boolean interceptTouchEvents; // ... public void setInterceptTouchEvents(boolean interceptTouchEvents) { this.interceptTouchEvents = interceptTouchEvents; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return interceptTouchEvents || super.onInterceptTouchEvent(ev); } } 

Luego puede evitar que los niños reciban eventos táctiles:

 InterceptTouchEventFrameLayout layout = (InterceptTouchEventFrameLayout) findViewById(R.id.layout); layout.setInterceptTouchEvents(true); 

Si tiene un escucha de clic configurado en el layout , todavía se activará.

Si desea desactivar un conjunto de, o decir un tipo particular de vista. Digamos que quiere desactivar un número fijo de botones con algún texto particular de o sin texto, entonces puede usar una matriz de ese tipo y recorrer los elementos de la matriz mientras deshabilita los botones usando la propiedad setEnabled (false) Puede hacerlo en una llamada a función como esta:

 public void disable(){ for(int i=0;i<9;i++){ if(bt[i].getText().equals("")){//Button Text condition bt[i].setEnabled(false); } } } 

Mejoré la respuesta tütü para deshabilitar correctamente los componentes EditText y RadioButton. Además, estoy compartiendo una forma que encontré para cambiar la visibilidad de la vista y agregar transparencia en las vistas deshabilitadas.

 private static void disableEnableControls(ViewGroup view, boolean enable){ for (int i = 0; i < view.getChildCount(); i++) { View child = view.getChildAt(i); child.setEnabled(enable); if (child instanceof ViewGroup){ disableEnableControls((ViewGroup)child, enable); } else if (child instanceof EditText) { EditText editText = (EditText) child; editText.setEnabled(enable); editText.setFocusable(enable); editText.setFocusableInTouchMode(enable); } else if (child instanceof RadioButton) { RadioButton radioButton = (RadioButton) child; radioButton.setEnabled(enable); radioButton.setFocusable(enable); radioButton.setFocusableInTouchMode(enable); } } } public static void setLayoutEnabled(ViewGroup view, boolean enable) { disableEnableControls(view, enable); view.setEnabled(enable); view.setAlpha(enable? 1f: 0.3f); } public static void setLayoutEnabled(ViewGroup view, boolean enable, boolean visibility) { disableEnableControls(view, enable); view.setEnabled(enable); view.setAlpha(enable? 1f: 0.3f); view.setVisibility(visibility? View.VISIBLE: View.GONE); } 

Esta es una respuesta bastante tardía. Pero podría ayudar a alguien. Muchas de las respuestas mencionadas anteriormente parecen ser buenas. Pero si su layout.xml ha nested viewgroups. Entonces las respuestas anteriores pueden no proporcionar un resultado completo. Por lo tanto, he publicado mi opinión como un fragmento. Con el código siguiente, uno puede deshabilitar todas las vistas (incluyendo grupos de vistas nesteds).

NOTA: intente evitar ViewGroups nesteds ya que no son recomendados.

  private void setEnableView(boolean b) { LinearLayout layout = (LinearLayout)findViewById(R.id.parent_container); ArrayList arrVg = new ArrayList<>(); for (int i = 0; i < layout.getChildCount(); i++) { View child = layout.getChildAt(i); if (child instanceof ViewGroup) { ViewGroup vg = (ViewGroup) child; arrVg.add(vg); } child.setEnabled(b); } for (int j=0;j< arrVg.size();j++){ ViewGroup vg = arrVg.get(j); for (int k = 0; k < vg.getChildCount(); k++) { vg.getChildAt(k).setEnabled(b); } } } 

para deshabilitar una vista, debe llamar al método setEnabled con falso para el argumento. ex:

 Button btn = ... btn.setEnabled(false); 

Conjunto

 android:descendantFocusability="blocksDescendants" 

para su vista ViewGroup. Todos los descendientes no se enfocarán.