如何禁用布局内的所有视图?
例如,我有:
<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视图。 所有的后代将不会重视。