2011-08-15 79 views
49

比如我有:如何禁用布局内的所有视图?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    <Button 
     android:id="@+id/backbutton" 
     android:text="Back" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
    <LinearLayout 
     android:id="@+id/my_layout" 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
     <TextView 
      android:id="@+id/my_text_view" 
      android:text="First Name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
     <EditText 
      android:id="@+id/my_edit_view" 
      android:width="100px" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
     <View .../> 
     <View .../> 
     ... 
     <View .../> 
    </LinearLayout> 

</LinearLayout> 

有没有一种方法来禁用(setEnable(假))内的LinearLayout my_layout所有元素?

回答

69

另一种方式是在每个孩子调用的setEnabled()(例如,如果你想要做一些额外的检查儿童禁用之前)

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

谢谢,@ 4e6! – Scit

+12

但是,这只适用于一级儿童,如果你有嵌套的意见,它将无法正常工作。 – htafoya

+4

这个接受的答案是不正确的,因为它包含代码中的错误(通过'i'循环应该从0到子计数**完全**)。 @tutu的答案是正确的。不幸的是,SO不允许少于6个字符的编辑。只有作者或版主才能更正此问题。多可惜。 – Stan

89

这个人是递归的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); 
     } 
    } 
} 
+0

好的代码段,但滚动视图仍然可以滚动,需要更多代码的额外功能 – htafoya

+0

我会去夜间Nexus的答案,因为它涵盖所有视图递归..... – AntonSack

+0

纺纱机没有得到禁用不知道为什么:( –

9

让我们改变楚楚的代码

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

我认为,存在只是让一个ViewGroup DISABL没有点即如果你想这样做,还有另外一种方法可以用于完全相同的目的。创建视图为您的组视图的同级:

<View 
    android:visibility="gone" 
    android:id="@+id/reservation_second_screen" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="bottom" 
    android:background="#66ffffff" 
    android:clickable="false" /> 

并且在运行时,使其可见。注意:您的组视图的父级布局应该是相对或框架布局。希望这会有所帮助。

+0

你的代码不会失效,例如微调,因为微调扩展ViewGroup – qbait

48

图图的答案是在正确的轨道上,但他的递归有点尴尬。我觉得这是更清洁:

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

优秀的解决方案。谢谢 – Blodhgard

+0

这是正确的答案。它通过gh递归地。目前接受的答案只有一个深度。 –

+0

我仍然想知道你是如何得到这些upvotes! –

-1

禁用视图,则必须调用以虚假的参数的setEnabled方法。 例如:

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

android:descendantFocusability="blocksDescendants" 

对尤尔的ViewGroup视图。所有的后代都不会关注。

+0

他不是在问焦点。 –

2

如果一些绝望的开发人员在这里滚动,我有另一个选择来做到这一点。就我所做的实验而言,这也禁用了滚动功能。我们的想法是在所有的UI元素下,在RelativeLayout中使用像这样的View元素。

<View 
       android:id="@+id/shade" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="@color/primaryShadow" 
       android:visibility="gone"/> 

因此它被设置为在某种情况之前“消失”。然后当你想禁用你的用户界面时,你将它设置为可见。您也必须为此视图实施OnClickListener。这个onClickListener将捕获点击事件,并不会将其传递给底层元素。

0

使用下面的递归函数使您的子视图可见不见了。 第一个参数是你的父视图,第二个参数决定你是否想让父视图的子视图可见或消失。真=上可见的伪=不见了

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

虽然不是完全一样禁用布局内的观点,值得一提的是可以防止所有儿童接受触摸(无需递归的布局层次)通过重写​​方法:

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

} 

然后你就可以防止儿童接收触摸事件:

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

如果您在layout上设置了点击侦听器,它仍将被触发。

3

Actully什么对我的工作是:

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

,并撤消它:

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

完成这项工作的简单解决方案! – Schm1

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

和呼叫的方法是这样的:

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

如果你想禁用一组或者说某种特定的vi假设你想禁用固定数量的按钮以及某些特定的文字或不以文字 然后你可以使用该类型的数组并通过数组元素循环,同时使用setEnabled(false)属性禁用按钮你可以做到这一点在这样的函数调用:

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