android 설명 레이아웃 내부의 모든 뷰를 비활성화하려면 어떻게합니까?




linearlayout 설명 (12)

뷰를 무효로하려면, 인수로서 false를 지정해 setEnabled 메소드를 호출 할 필요가 있습니다. 전의:

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

예를 들면 :

<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 my_layout 안에있는 모든 요소를 ​​비활성화 (setEnable (false))하는 방법이 있습니까?


세트

android:descendantFocusability="blocksDescendants"

ViewGroup보기. 모든 자손은 초점을 잡지 않습니다.


레이아웃 내에서보기를 비활성화 하는 것과 똑같지는 않지만 ViewGroup#onInterceptTouchEvent(MotionEvent) 메서드를 재정 의하여 모든 자식이 접촉을받지 못하게 할 수 있습니다 (레이아웃 계층을 반복하지 않고도 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 상에 설정된 클릭 리스너가있는 경우, 여전히 트리거됩니다.


또 다른 방법은 각 자식에 대해 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);
}

필사적 인 개발자가 여기 아래로 스크롤하면, 내가 할 수있는 또 다른 옵션이 있습니다. 스크롤링 기능을 사용하지 않고 스크롤을 사용하지 않도록 설정했습니다. 이 아이디어는 모든 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 는 클릭 이벤트를 catch하고 기본 요소에 전달하지 않습니다.


아래의 재귀 함수를 사용하여 자식보기를 표시 하거나 사라지게 합니다. 첫 번째 인수는 부모 뷰이며 두 번째 인수는 부모 뷰의 자식을 표시할지 또는 사라지게할지 결정합니다. 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);
    }
}

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

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

EditText 및 RadioButton 구성 요소를 올바르게 사용하지 않도록 tütü 응답을 개선했습니다. 게다가, 나는보기 가시성을 변경하고 장애보기에서 투명성을 추가하는 방법을 공유하고 있습니다.

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

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

제 생각에는 뷰 그룹을 사용하지 않도록 설정할 필요가 없습니다. 원한다면 정확히 동일한 목적으로 사용했던 또 다른 방법이 있습니다. 그룹 뷰의 형제로 뷰 만들기 :

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

실행시에 그것을 보이게하십시오. 참고 : 그룹 뷰의 상위 레이아웃은 상대 레이아웃 또는 프레임 레이아웃이어야합니다. 희망이 도움이 될 것입니다.


이것은 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);
       }
    }
}

특정 종류의 뷰를 말하거나 사용하지 않으려는 경우. 특정 텍스트가 있거나 텍스트가없는 고정 된 수의 단추를 비활성화하려는 경우 해당 유형의 배열을 사용하고 배열 요소를 반복 할 수 있습니다. setEnabled (false) 속성을 사용하여 버튼을 비활성화하는 동안 다음과 같이 함수 호출을 수행 할 수 있습니다.

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

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




android-layout