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

例如,我有:

<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(false))LinearLayout my_layout内的所有元素?

另一种方法是在每个子项上调用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); } 

这个是ViewGroups的recursion

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

图图的答案是正确的,但他的recursion是有点尴尬。 我认为这是更清洁的:

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

让我们改变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); } } } 

我认为,只是使视图组禁用是没有意义的。 如果你想这样做,还有另外一种方法可以用于完全相同的目的。 创build视图作为你的组视图的兄弟:

 <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" /> 

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

如果一些绝望的开发者在这里滚动,我有另一个select。 就我所做的实验而言,这也禁用了滚动function。 这个想法是在所有的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将捕获点击事件,并不会将其传递给底层元素。

Actully对我来说是什么工作:

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

并撤消它:

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

使用下面的recursion函数使您的子视图可见消失 。 第一个参数是你的父视图,第二个参数决定你是否希望父视图的子视图可见或消失。 true =可见false =不见了

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

虽然与在布局中禁用视图不完全相同,但值得一提的是,您可以通过重写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); } } 

那么你可以防止孩子接触触摸事件:

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

如果您在layout设置了点击侦听器,则仍然会触发它。

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

要禁用视图,必须使用false为参数调用setEnabled方法。 例如:

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

 android:descendantFocusability="blocksDescendants" 

为yor ViewGroup视图。 所有的后代将不会重视。