버그 잡이

[코틀린] kotlin 커스텀뷰(customView) 만들기 본문

안드로이드/코틀린

[코틀린] kotlin 커스텀뷰(customView) 만들기

버그잡이 2020. 4. 6. 22:00

TextView, ImageView 등 기본적으로 제공되는 view 이외에도 자신이 원하는 customView를 만들어 사용할 수 있다.

 

왜 굳이 그렇게 해야하냐고?

 

- 자주 쓰이는 패턴이 있는데 일일이 만들기에는 시간이 많이 걸리고, 복붙해서 쓰자니 코드가 지저분해진다.

 

- 또, customView에 메소드를 만들어 사용할 수 있다. 내가 원하는 동작을 보다 깔끔하게 반영할 수 있는 것이다.

 

 

*코드 출처

(유튜버 디모님)

https://www.youtube.com/watch?v=hr-ZDc2mNZE&list=PLQdnHjXZyYaemV1ievGAfgE-YXp3HddnK&index=5

 

 

 

[순서]

 

1. xml 파일을 만든다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="8dp">

    <ImageView
        android:id="@+id/typeImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_alarm_black"/>

    <TextView
        android:id="@+id/infoText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"/>

</LinearLayout>

- 알람 아이콘과 그 옆에 알람시간이 나오는 구성이다.

 

 

 

 

2. view 클래스를 만든다.

open class InfoView @JvmOverloads constructor(context: Context, attrs: AttributeSet?=null, defStyleAttr: Int=0)
    : LinearLayout(context, attrs, defStyleAttr){

    companion object{
        private val dateFormat = SimpleDateFormat("yy/MM/dd HH:mm")
    }

    init{
        inflate(context, R.layout.view_info, this)
        typeImage.setImageResource(R.drawable.ic_alarm_black)
        infoText.setText("")
    }

    fun setAlarmDate(alarmDate: Date){
        if(alarmDate.before(Date())){   //현재 시간보다 이전이면 알람이 없다고 표시
            infoText.setText("알람이 없습니다.")
        }
        else{
            infoText.setText(dateFormat.format(alarmDate))
        }
    }

}

- LinearLayout을 상속받음으로써 xml파일을 하나의 뷰로 만들 수 있다

  *Layout기반의 customView를 만들 경우 기반이 되는 레이아웃을 상속받아야 해당 레이아웃을 inflate 할 수 있다.

  *View를 상속받아서 만드는 CustomView는 Canvas를 할용해서 직접 그리는 customView 같다(?)

 

- init을 통해서 view의 초기상태를 설정한다.

 

- setAlarmDate와 같은 메서드도 구현할 수 있다.

 

 

 

*JVMOverLoad란 무엇인가?

 

- 커스텀 뷰를 정의할때는 생성자를 여러개 선언해야 하는데(overload) 이를 쉽게 정의할 수 있게 도와주는 놈이다.

 

http://blog.naver.com/PostView.nhn?blogId=zion830&logNo=221380537190&redirect=Dlog&widgetTypeCall=true&directAccess=false

 

 

 

 

반응형
Comments