Comment puis-je désactiver toutes les vues dans la mise en page?

Par exemple, j’ai:

 

Y a-t-il un moyen de désactiver (setEnable (false)) tous les éléments à l’intérieur de LinearLayout my_layout ?

Une autre méthode consiste à appeler setEnabled () sur chaque enfant (par exemple, si vous souhaitez effectuer une vérification supplémentaire sur l’enfant avant de le désactiver).

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

celui-ci est récursif pour 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 réponse de tutu est sur la bonne voie, mais sa récursivité est un peu maladroite. Je pense que c’est plus propre:

 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); } } } 

Actully ce qui fonctionne pour moi est:

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

et pour le défaire:

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

Changeons le code 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); } } } 

Je pense qu'il ne sert à rien de simplement désactiver viewgroup. Si vous voulez le faire, il y a une autre manière que j'ai utilisée pour exactement le même but. Créer une vue en tant que frère de votre vue de groupe:

  

et à l'exécution, le rendre visible. Remarque: la mise en page parente de votre groupview doit être soit relative, soit mise en page. J'espère que cela aidera.

Si un développeur désespéré défile ici, j’ai une autre option pour le faire. Ce qui désactive également le défilement aussi loin que je l’ai expérimenté. L’idée est d’utiliser l’élément View comme celui-ci dans un RelativeLayout, sous tous vos éléments d’interface utilisateur.

  

Donc, il est réglé pour être “parti” avant une certaine condition. Et puis, vous définissez sa visibilité sur VISIBLE lorsque vous souhaitez désactiver votre interface utilisateur. Vous devez également implémenter OnClickListener pour cette vue. Ce onClickListener intercepte les événements de clic et ne les transmet pas aux éléments sous-jacents.

  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); } } 

et appelez la méthode comme ceci:

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

Utilisez la fonction récursive ci-dessous pour rendre vos vues enfant visibles ou disparues . Le premier argument est votre vue parent et le second argument décide si vous voulez que les enfants de la vue parent soient visibles ou disparus. true = visible false = disparu

 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); } } 

Bien que ce ne soit pas tout à fait la même chose que la désactivation des vues dans une mise en page, il est important de mentionner que vous pouvez empêcher tous les enfants de recevoir des contacts

 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); } } 

Vous pouvez alors empêcher les enfants de recevoir des événements tactiles:

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

Si vous avez un écouteur de clic sur la layout en layout , il sera toujours déclenché.

Si vous voulez désactiver un ensemble de, ou dire un type particulier de vue. Disons que vous voulez désactiver un nombre fixe de boutons avec du texte particulier ou sans texte, vous pouvez alors utiliser un tableau de ce type et parcourir les éléments du tableau. tout en désactivant les boutons en utilisant la propriété setEnabled (false) Vous pouvez le faire sur un appel de fonction comme ceci:

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

J’ai amélioré la réponse de tütü pour désactiver correctement les composants EditText et RadioButton. En outre, je partage un moyen que j’ai trouvé pour modifier la visibilité de la vue et append de la transparence dans les vues désactivées.

 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); } 

C’est une réponse assez retardée. Mais cela pourrait aider quelqu’un. Beaucoup de réponses mentionnées ci-dessus semblent être bonnes. Mais si votre layout.xml comporte des groupes de vues nesteds. Les réponses ci-dessus peuvent ne pas donner de résultat complet. Par conséquent, j’ai posté mon avis comme un extrait. Avec le code ci-dessous, vous pouvez désactiver toutes les vues (y compris les groupes de vues nesteds).

REMARQUE: Essayez d’éviter les groupes de vues nesteds, car ils ne sont pas recommandés.

  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); } } } 

Pour désactiver une vue, vous devez appeler la méthode setEnabled avec false pour l’argument. ex:

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

Ensemble

 android:descendantFocusability="blocksDescendants" 

pour la vue ViewGroup. Tous les descendants ne se focaliseront pas.