본문 바로가기
Android/Dev

CheckBox, switch 등을 ReadOnly처럼 사용하기

by featherwing 2020. 6. 2.
반응형

CheckBox나 Switch등은 클릭 이벤트가 발생하면 체크가 되거나 스위치가 온오프되는 편리한 기능을 가지고 있습니다.

 

보통은 아래와 같이 사용합니다.

mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
 mCheckBox.setChecked(isChecked);
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(isChecked) {
                      //TODO check true  
                    } else {
                      //TODO check false  
                    }
                }
            });

 

별다른 처리를 하지 않더라도 편리하게 사용할 수 있는 이 기능은,

 

스위치나 체크박스를 선택 -> 특정 기능의 on/off 의 순서로 기능을 구현 할 때는 굉장히 편리하지만

 

스위치나 체크박스를 선택 -> 특정기능을 설정하는 Dialog등을 띄움 -> 특정 기능의 on/off 

 

와 같이 중간에 한단계를 더 거치게 된다면 굉장히 번거롭게 됩니다.

 

온오프로 바로 상태가 변하게 되기 때문에 dialog와 같은 중간단계에서 해당 기능 설정을 하지 않거나 하게되어도

 

스위치나 체크박스는 온오프로 변하기 때문입니다.

 

즉 체크박스와 스위치는 오직 상태를 표시하는 readOnly로 사용할 수 있도록 만들어야 하는데

넷에서는 아래와 같이 xml에 

 

android:enabled="false" 

  <androidx.appcompat.widget.AppCompatCheckBox
	android:enabled="false"
        android:checked="false"
        android:id="@+id/check_readonly"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
       />

옵션을 부여하면 기능 구현을 할 수 있다고 하는데,

이렇게 하니 체크박스의 상태는 변하지 않았으나

체크박스에 onCheckedChangeLister나 onClickListener를 붙여도 작동하지 않았습니다.

 

때문에.. 해당 기능 구현을 위해서 아래와 같이 기능을 구현 해 줍니다.

xml 레이아웃에서 체크 박스에 onClick 이벤트가 발생하지 않도록, 체크박스를 덮는 FrameLayout을 만들어주고

FrameLayout에 onClickListener를 달아서 해당 기능을 구현 해 주었습니다.

 

    <RelativeLayout
        android:layout_width="36dp"
        android:layout_height="36dp"
        android:orientation="horizontal">

        <androidx.appcompat.widget.AppCompatCheckBox
            android:checked="false"
            android:id="@+id/check_readonly"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            />
        <FrameLayout
            android:id="@+id/check_button"
            android:focusable="true"
            android:clickable="true"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </RelativeLayout>
   CheckBox mCheckBox = findViewById(R.id.check_readonly);
   FrameLayout mCheckbutton = itemView.findViewById(R.id.check_button);   

   mCheckbutton.setOnClickListener(v -> {
            setCheckListener();
        });
        
        
        
            public void setAlarmCheckListener() {
            if(mCheckBox.isChecked()) {
                //TODO 체크박스가 체크되어 있을 때
            } else {
                //TODO 체크박스가 체크되어 있지 않을 때
            }

    }
    
    
    

작업 수행후에는 mCheckBox.setChecked(true); 등을 통해서 체크상태를 변경 해 주면 됩니다.

반응형

댓글