GDSC HUFS 3기/Android with Kotlin Team 1

[1팀] 12~16. 리스너,위젯들의 특성 이해하기

raphel_K 2021. 10. 26. 19:48

이 글은 이것이 안드로이드다 with 코틀린(개정판)를 참고하여 작성하였습니다.

작성자 : 강현우

개발환경은 Windows, Android Studio입니다. 

이번 글에서 주로 다룰 것은 listener 인터페이스와 특정 위젯들에 대한 특성들입니다.

 

  1. Listener 

리스너는 어플을 실행시에 특정 객체를 실행시킬때, 리스너와 연동이 되어 있다면 리스너 안에 있는 함수(들)을 실행시키는 역할을 한다. 수업에서는 button과 연동시켰기 때문에 logcat으로 확인해보면 "클릭되었습니다."가 출력되는 것을 확인 할 수 있다.

 

리스너의 기본 골조

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val listener = object : View.OnClickListener{
            override fun onClick(v: View?) {
                Log.d("리스너","클릭되었습니다.")
            }
        }
        button.setOnClickListener(listener)
    }
}
  • 만약 리스너 안에 함수가 한개 밖에 없다면, 파이썬과 같이 람다표현으로 코드를 단축시킬 수 있다. 하지만, 함수가 2개 이상부터는 불가능하다.

 

  • 에러 발생 이유와 해결 방법

에러가 발생하는 이유는 이제 kotlin-android-extension이 android studio 4.1이 이후부터 공식적으로 deprecated가 되어서다. 수업을 따라가다 보면 분명 똑같이 했는데 button이 에러표시가 되는 것을 볼 수 있다. 이를 해결하기 위해서는 다음과 같이하면 된다.

import kotlinx.android.synthetic.main.activity_main.*

해당 코드를 임포트 해주면 되지만, 분명 또 kotlinx가 에러표시가 되는 것을 볼 수 있다. 다음 단계는 build.gradle(:app) 최상단에  plugins{}안으로 아래와 같은 코드를 입력해주고, Sync Now를 눌러주면 모든 에러가 해결된다.

id 'kotlin-android-extensions'

 

  • 왜 kotlin-android-extension이 android studio에서 deprecated되었는지.

실수가 생각보다 생길 수 있는 여지가 많다. 그리고 이러한 문제는 빌드 타임이 아닌 런타임에 오류를 유발시키고, RecyclerView에 문제가 생긴다.

동일한 id를 가진 위젯에 문제가 생긴다.

유효하지 않은 조회에 대한 검사 없이 실제로 확장된 레이아웃과 관련이 없는 id의 글로벌 네임스페이스를 노출하고, 일부 구성에만 뷰가 있는 경우 null 허용 여부를 노출하지 않는다.

위와 같이 간편하다고 생각한 kotlin-android-extension은 많은 에러를 일으킬 여지를 가지고 있었다.

 

몇몇 위젯들의 특성

  1. Button

button에서는 listener을 제외하곤, Attributes에서 다 제어할 수 있다.

gravity: 어느쪽으로 '중력'을 작용시킬지 설정하는 특성이다. 디폴트값은 가로,세로의 중앙이다.

alpha: 투명도, 1~0까지의 값을 가지며 1이 가장 선명한 색을 나타낸다.

 

  • 실수를 일으키지 않기 위해서 쓰는 resource directory

resource directory -> values -> strings.xml으로 들어가면 실수를 미연에 방지하기 위해서 위젯들의 이름을 미리 설정해놓는 곳이 있다.

<resources>
    <string name="app_name">mostusedwidget</string>
    <string name="hello">나는문어 \n Nice to meet u</string>
    <string name="button">와.즐겁다.</string>
</resources>

위와 같이 위젯의 text 특성에 "" 안에 있는 글을 쓰면, >< 사이에 있는 글이 자동으로 연동된다.

예시) button 위젯의 text 특성에 hello를 입력하면, @string/hello가 표시되며. 나는문어 \n Nice to meet u가 나타난다.

  • Textview

max lines: 최대 줄 수를 설정한다.

min lines: 최소 줄 수를 설정한다.

single lines:  강제로 단일 줄로 만들어 버린다.

  • ellipsize에서 marquee(왔다갔다하는 설정)를 진행할 경우 single line은 true로 설정되어 있어야한다.

fontFamily: 폰트를 설정하는 것이다.

max length: 최대 글자 수를 설정한다.(띄어쓰기 포함)

textsize: 글자의 크기를 설정하는 것이다.

 

  • textsize의 고유 특징

textsize는 다른 특성들과 다르게(기존 단위는 dp) 단위가 sp(scaled independent)이다. 

resource directory에서 string을 설정했던것처럼 textsize또한 가능하다. 방법은 values->우클릭->new->values resource file-> file name: dimes이고,

<resources>
    <dimen name = "button_height">100dp</dimen>
</resources>

위와 같은 방법으로 설정하면된다. 단위는 필수이다!