안드로이드

안드로이드 코틀린 익스텐션 사용하기. how to use kotlin extension in Android

알통몬_ 2019. 2. 12. 17:51
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 안드로이드에서 공식언어로 채택한 코틀린의 Extension 사용 예제입니다.

쉽게 말하면 제가 자주 사용하는 DataBinding의 코틀린 버전이라고 생각하면 되는데요.


findViewById(R.id.~~) 을 더 이상 사용하지 않을 수 있다는 장점이 있습니다.


사용방법.

먼저 코틀린을 사용하도록 Gradle설정을 해야겠죠?


앱 레벨 Gradle

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version
"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:multidex:1.0.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

프로젝트 레벨 Gradle

buildscript {
ext.kotlin_version =
'1.3.11'
repositories {
google()
jcenter()

}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
jcenter()

}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

큰 글씨로 볼드처리된 코드들을 추가해주시면 됩니다.


사용방법은 너무 간단합니다.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:id="@+id/abcTxtView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="코틀린 익스텐션 테스트!"
android:textSize="36sp"
android:textColor="@android:color/black"
android:gravity="center"
app:layout_constraintBottom_toTopOf="@+id/kotExtRecyclerView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

<android.support.v7.widget.RecyclerView
app:layout_constraintTop_toBottomOf="@id/abcTxtView"
app:layout_constraintBottom_toBottomOf="parent"
android:id="@+id/kotExtRecyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"/>

</android.support.constraint.ConstraintLayout>

레이아웃 구성이 위와 같을 때

id가 abcTxtView 인 TextView가 있고

id가 kotExtRecyclerView 인 RecyclerView가 있죠.

이 친구들을 MainActivity 에서

val tv = findViewById<TextView>(R.id.abcTxtView)

tv.text = "기존 사용방법"

처럼 사용했다면

코틀린 익스텐션을 사용하면

package com.example.kotlinextensionexample

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
abcTxtView.text = "코틀린 익스텐션!!!"


}
}

id를 바로 불러와서 사용할 수 있습니다.

import 된 부분을 보면

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

가 추가된 걸 볼 수 있습니다.


그냥 여기까지만 하면 포스팅도 짧고 정보가 적죠?

[ 광고 보고 가시죠! ]



[ 감사합니다! ]

그래서 RecyclerView의 Adapter에 ViewHolder패턴을 사용할 때는 

코틀린 익스텐션을 어떻게 사용하면 되는지 알아보겠습니다.

item_kotlin.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/titleTxtView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:textColor="@android:color/black"
android:textSize="24sp"
android:layout_width="wrap_content"
android:layout_height="48dp"/>
</android.support.constraint.ConstraintLayout>


MainAdapter

package com.example.kotlinextensionexample

import android.app.Activity
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import kotlinx.android.synthetic.main.item_kotlin.view.*
import java.util.*

class MainAdapter(private val activity: Activity) : RecyclerView.Adapter<MainAdapter.MainHolder>() {

var titles = Vector<String>()
private val context = activity.applicationContext

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainHolder {
return MainHolder(parent)
}

override fun onBindViewHolder(holder: MainHolder, position: Int) {
holder.itemView.titleTxtView.text = titles[position]
}



override fun getItemCount(): Int {
return titles.size
}

fun update(titles: Vector<String>) {
this.titles = titles
notifyDataSetChanged()
}

inner class MainHolder(parent: ViewGroup) :
RecyclerView.ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_kotlin, parent, false))
}

기존에 Databinding을 사용해보신 분들이면 쉽게 이해하실 수 있을 거에요.

사용 방법이 조금 더 쉬워졌죠?

MainActivity

package com.example.kotlinextensionexample

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
abcTxtView.text = "코틀린 익스텐션!!!"
val linearLayoutManager = LinearLayoutManager(this)
kotExtRecyclerView.layoutManager = linearLayoutManager
val mainAdapter = MainAdapter(this)
kotExtRecyclerView.adapter = mainAdapter
val titles = Vector<String>()
titles.add("극한 직업")
titles.add("뺑반")
titles.add("드래곤 길들이기3")
titles.add("킹덤")
titles.add("극한 직업1")
titles.add("극한 직업2")
titles.add("극한 직업3")
titles.add("극한 직업4")
titles.add("극한 직업5")
titles.add("극한 직업6")
titles.add("극한 직업7")
titles.add("극한 직업7")
titles.add("극한 직업8")
titles.add("극한 직업9")
titles.add("극한 직업6")
titles.add("극한 직업666")
titles.add("극한 직업66")
titles.add("극한 직업5435")
mainAdapter.update(titles)

}
}

궁금하신 부분이나 이해가 안되는 부분은 댓글달아주세요 ㅎㅎ

소스는 깃허브에 공유해놓았습니다.

https://github.com/Parksunggyun/KotlinExtensionExample


이상입니다. 감사합니다.

반응형