상세 컨텐츠

본문 제목

[Kotlin] Widget 만들기

Mobile/Kotlin

by 클리엘 클리엘 2020. 12. 22. 16:17

본문

728x90

Android Studio에서 기본적으로 제공하는 위젯 중 필요한 기능을 가진 위젯이 없으면 직접 만들어 사용하는 것도 가능합니다. 이번에는 그 방법에 대해 알아보고자 합니다.

 

우선 내가 만들 위젯에 필요한 설정파일을 생성합니다. 사실 위젯을 생성하는데 설정 파일이 반드시 필요한 건 아니지만 설정 파일을 따로 만들어 위젯에 제공하는 것이 위젯을 관리하기에 용이하므로 만들 것을 권장합니다.

 

Android Studio에서 app -> res -> values 폴더에서 마우스 오른쪽 버튼을 눌러 Value Resource File을 선택합니다.

 

설정파일의 이름을 지정하고 OK 버튼을 눌러줍니다. 예제에서는 my_widget_attr이라고 하였습니다.

 

파일이 생성되면 파일 내용을 다음과 같이 수정합니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="myWidget">
        <attr name="txtColor" format="color"></attr>
    </declare-styleable>
</resources>

지금 만들어볼 위젯은 임의의 문자열을 표시하는 위젯이며 txtColor라는 색상 설정에 따라 문자열의 표시 색상을 바꿀 수 있는 위젯입니다. 위 XML을 보면 name을 myWidget이라고 하였는데 이것은 위젯을 만들 때 사용될 클래스의 이름입니다. 문자열에 색상을 설정한다는 것은 어차피 TextView라는 기본 위젯에서도 가능한 부분이지만 위젯을 임의로 만들어 본다는 것에 초점을 맞춰 진행해 보도록 하겠습니다.

 

다음으로 app -> java -> [패키지명]에서 Kotlin File/Class를 선택합니다.

 

이어지는 창에서 Class를 선택하고 이름을 myWidget으로 설정해 클래스를 생성합니다.

 

클래스 파일이 생성되면 다음과 같이 AppCompatTextView로부터 상속받게 하고 생성자를 2개 만들어 줍니다. 첫 번째는 코드상에서 위젯을 생성할 때 호출되며 두 번째는 레이아웃에서 호출되는 생성자입니다.

class myWidget : androidx.appcompat.widget.AppCompatTextView {
    constructor(context: Context): super (context) {

    }

    constructor(context: Context, attrs: AttributeSet): super (context, attrs) {

    }
}

이제 두번째 생성자에서 설정값을 가져와 적용하는 코드를 추가합니다.

constructor(context: Context, attrs: AttributeSet): super (context, attrs) {
    val widget_attr = context.obtainStyledAttributes(attrs, R.styleable.myWidget)
    val widget_attr_count = widget_attr.indexCount

    for (i in 0 until widget_attr_count) {
        when (widget_attr.getIndex(i)) {
            R.styleable.myWidget_txtColor -> {
                val c = widget_attr.getColor(widget_attr.getIndex(i), 0)
                setTextColor(c)
            }
        }
    }
}

위젯의 속성은 context.obtainStyledAttributes(attrs, R.styleable.myWidget) 구분을 통해 가져옵니다. 밑에서 widget_attr_count변수에 갸져 온 속성의 개수를 넣고 for 반복문으로 속성의 수만큼 순회하면서 속성이 txtColor인 경우(myWidget_txtColor) 해당 속성 값을 가져오도록 하였습니다. 가져온 값은 그대로 setTextColor() 함수를 통해 색상값을 설정하고 있는데, 사실 현재 myWidget의 속성은 txtColor 하나밖에 없으므로 굳이 복잡하게 순회하면서 가져올 필요는 없습니다. 하지만 필요에 따라 위젯에 여러 가지 속성을 추가하게 되고 결국 다수의 속성이 존재할 때 원하는 속성 값을 가져올 수 있어야 하기에 처음부터 위에서 처럼 작성하는 것이 좋습니다.

 

Activity_Main의 디자인모드로 돌아오면 Palette하단에 Project가 생성되어 있는 걸 볼 수 있습니다. 만약 Project가 보이지 않는다면 Android Studio를 닫았다가 다시 열어주세요. Project를 선택하면 위에서 추가한 myWidget이 나오게 되고 이것을 그대로 Layout위에 올려줍니다.

 

임의의 text값을 설정하고 All Attribute부분에서 아래쪽에 보면 txtColor라는 속성을 볼 수 있는데 이 속성 값으로 임의의 색상을 지정해 줍니다.

 

에뮬레이터를 통해 앱을 실행시켜 보면 속성값이 반영되어 있는 걸 확인할 수 있습니다.

 

728x90

'Mobile > Kotlin' 카테고리의 다른 글

[kotlin] 권한 처리하기  (0) 2020.12.23
[Kotlin] 위젯 - ViewPager2  (0) 2020.12.23
[Kotlin] Widget 만들기  (0) 2020.12.22
[Kotlin] View  (0) 2020.12.22
[Kotlin] Flagment  (0) 2020.12.21
[Kotlin] Spinner  (0) 2020.12.18

관련글 더보기

댓글 영역