[android] 레이아웃 내의 모든보기를 비활성화하려면 어떻게해야합니까?

예를 들면 다음과 같습니다.

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

LinearLayout 내부의 모든 요소를 ​​비활성화 (setEnable (false))하는 방법이 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에 대해 재귀 적입니다.

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


답변

투투의 대답은 올바른 방향이지만 그의 재귀는 약간 어색합니다. 나는 이것이 더 깨끗하다고 ​​생각한다.

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


답변

실제로 나를 위해 일하는 것은 :

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

실행 취소하려면 :

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


답변

특정 ViewGroup에서 뷰를 비활성화하는 데 관심이 있다면 흥미롭고 약간 모호한을 사용할 수 있습니다 duplicateParentState. 보기 상태는 눌림, 사용, 활성화 등의 부울 속성 집합입니다. 부모 ViewGroup에 동기화하려는 각 자식에 대해 다음을 사용하십시오.

android:duplicateParentState="true"

활성화 된 상태뿐만 아니라 전체 상태를 복제합니다. 이것은 당신이 원하는 것일 수 있습니다! 물론이 방법은 레이아웃 XML을로드하는 경우 가장 좋습니다.


답변

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

뷰 그룹을 비활성화하는 데는 의미가 없다고 생각합니다. 당신이 그것을 원한다면, 정확히 같은 목적으로 사용한 또 다른 방법이 있습니다. groupview의 형제로보기 만들기 :

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

런타임에 표시되도록합니다. 참고 : 그룹보기의 상위 레이아웃은 상대 레이아웃이거나 프레임 레이아웃이어야합니다. 이것이 도움이되기를 바랍니다.


답변

필사적 인 개발자가 여기 아래로 스크롤하면 다른 옵션이 있습니다. 또한 내가 실험 한 한 스크롤링을 비활성화합니다. 아이디어는 모든 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"/>

따라서 어떤 조건 전에 “사라짐”으로 설정됩니다. 그런 다음 UI를 비활성화하고 싶을 때 가시성을 VISIBLE로 설정합니다. 또한 OnClickListener이보기 를 구현해야합니다 . 이것은 onClickListener클릭 이벤트를 포착하고 기본 요소로 전달하지 않습니다.