일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- PySpark
- hive
- Python
- Java
- dataframe
- math
- GIT
- Google Excel
- list
- Redshift
- c#
- gas
- google apps script
- array
- string
- Excel
- Kotlin
- PANDAS
- PostgreSQL
- Mac
- SQL
- Github
- django
- Tkinter
- Apache
- Google Spreadsheet
- 파이썬
- numpy
- matplotlib
- Today
- Total
달나라 노트
Android Studio - 다른 custom package import하기 본문
보통 기능적인 내용(class, function 등)은 Android Studio에서 MainActivity.kt 파일 내에 적게됩니다.
근데 앱이 복잡해지고 여러 기능들이 추가되면서 선언되는 class, function이 많아지면 한 파일 내에 모든 것을 관리하는건 어려움이 있죠.
그래서 따로 .kt 파일을 생성하여 나눠서 관리하는 경우가 많습니다.
그러면 MainActivity.kt로 내가 만든 다른 .kt 파일들의 class를 어떻게 import시키는지를 알아봅시다.
먼저 Test를 할 view를 만들건데
TextView 1개와 Button 2개를 만들어서 버튼을 누를 때 마다 TextView에 글자를 띄워주거나 적힌 글자를 지우도록 할 것입니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/result_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Test text" />
<Button
android:id="@+id/btn_show_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Show text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/result_text" />
<Button
android:id="@+id/btn_clear_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Clear text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_show_text" />
</androidx.constraintlayout.widget.ConstraintLayout>
그러면 위와 같은 View가 완성됩니다.
Test Text가 적힌 곳에 글자가 출력될 것이며,
SHOW TEXT 버튼은 글자를 띄워주고,
CLEAR TEXT 버튼은 적힌 글자를 지워주는 기능을 하게 될 것입니다.
이제 각 버튼에 할당할 function을 정의할 차례입니다.
먼저 아래 이미지처럼 MainActivity.kt가 있는 곳에 Package를 만들어줍시다.
Package 버튼을 누르면
위와 같은 화면이 뜰텐데 아래 이미지처럼 가장 끝 부분에 functions라는 이름을 입력해줍시다.
그리고 생성된 functions라는 directory에 우클릭하여 Kotlin Class/File 버튼을 눌러서 함수의 내용을 담을 .kt 파일을 생성해줍시다.
위같은 이미지에 생성할 .kt파일 이름을 입력하면 되는데
저희는 2개를 생성할겁니다.
show_text.kt
clear_text.kt
이제 directory를 보면 위와 같은 형태가 되어있습니다.
show_text.kt 파일을 보면 위와 같은 내용이 적혀있을겁니다.
가장 첫 줄의 package com.example.test.funcions는 간단하게 show_text.kt가 어느 package directory에 있는지를 나타낸다고 생각하면 됩니다.
위에 directory형태를 보면
com.example.text 안에 functions라는 폴더가 있고 그 폴더 안에 show_text라는 파일이 있죠.
또한 class도 파일명(show_text.kt)과 동일하게 적혀있습니다.
미리 말하면 나중에 MainActivity.kt에서 show_text.kt파일을 import할 땐 show_test.kt의 show_text class를 import하게 될겁니다.
이 class 안에 원하는 내용들을 적으면 되는것이죠.
show_test.kt
package com.example.test.functions
import android.widget.TextView
import com.example.test.R
class show_text {
fun show(view: TextView) {
val result_text = view.findViewById<TextView>(R.id.result_text)
result_text.text = "I like apple."
}
}
내용을 위처럼 적었습니다.
하나씩 봐봅시다.
show라는 이름의 function을 선언하였고 argument로는 TextView 형식의 view라는 이름의 변수를 받게됩니다.
왜냐면 이 함수는 TextView에다가 글자를 띄워줘야하기 때문이죠.
함수 내부에는 text_view라는 변수에 id가 result_text인 TextView를 찾아서 넣고 있습니다.
그리고 마지막으로 text 속성에 I like apple. 이라는 글자를 할당하고있죠.
(이렇게 코드 내용을 적으면 import andoird.widget.TextView 등의 기타 필요한 import 내용은 자동으로 추가됩니다.)
이렇게 글자를 보여주는 기능이 완성되었습니다.
그러면 글자를 지워주는 내용도 작성해봅시다.
이 내용은 clear_text.kt 파일에 정의될겁니다.
clear_text.kt
package com.example.test.functions
import android.widget.TextView
import com.example.test.R
class clear_text {
fun clear(view: TextView) {
val result_text = view.findViewById<TextView>(R.id.result_text)
result_text.text = ""
}
}
show_text.kt의 내용과 비슷하지만 함수명과 text 속성에 할당되는 내용이 공백("")으로 다릅니다.
이제 기능적인 function들은 다 적었으니
이 function들을 MainActivity에서 Button에 할당해봅시다.
MainActivity.kt
package com.example.test
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.example.test.functions.clear_text
import com.example.test.functions.show_text
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btn_show_text = findViewById<Button>(R.id.btn_show_text)
btn_show_text.setOnClickListener() {
val result_text_view = findViewById<TextView>(R.id.result_text)
val cls_show_text = show_text()
cls_show_text.show(result_text_view)
}
val btn_clear_text = findViewById<Button>(R.id.btn_clear_text)
btn_clear_text.setOnClickListener() {
val result_text_view = findViewById<TextView>(R.id.result_text)
val cls_clear_text = clear_text()
cls_clear_text.clear(result_text_view)
}
}
}
완성된 코드는 위와 같습니다.
부분부분 나눠봅시다.
import com.example.test.functions.show_text // 4-1
class MainActivity : AppCompatActivity() {
...
val btn_show_text = findViewById<Button>(R.id.btn_show_text) // 1
btn_show_text.setOnClickListener() { // 2
val result_text_view = findViewById<TextView>(R.id.result_text) // 3
val cls_show_text = show_text() // 4
cls_show_text.show(result_text_view) // 5
}
...
}
}
먼저 show_text class를 할당하는 과정입니다.
1. btn_show_text라는 id를 가진 Button View를 btn_show_test에 할당합니다.
2. 생성한 button 객체의 setOnClickListener에 원하는 기능들을 설정해줍니다.
3. 글자를 나타낼 id = result_text인 TextView를 변수 result_text_view에 담습니다.
4. show_text.kt 파일에서 정의된 show_text라는 class를 cls_show_text 변수에 할당합니다.
이 부분이 핵심인데 android studio는 현재 프로젝트 내에 정의된 여러 Package와 각 package에 존재하는 여러 class들을 기본적으로 인식하고 있습니다.
따라서 위처럼 원하는 class 이름만 입력하면 자동으로 4-1에서 보는것처럼 해당 class가 있는 show_text.kt 파일을 자동으로 import해줍니다.
여기서 주의할 점은 4-1에서 의미하는 functions.show_text는 show_text.kt 파일을 의미하며
4에서 말한 show_text()는 show_text.kt 파일 안에 있는 show_text class를 의미합니다.
5. cls_show_text는 show_text() class를 이용해 생성되었으므로 show_text() class 내에 있는 show 함수도 가지고 있습니다.
이 show함수를 실행합니다.
또한 함수 실행 시 view: TextView가 argument로 들어갔었죠?
따라서 show 함수 실행 시에 미리 생성해둔 result_text_view를 넣어줍니다.
import com.example.test.functions.clear_text
class MainActivity : AppCompatActivity() {
...
val btn_clear_text = findViewById<Button>(R.id.btn_clear_text)
btn_clear_text.setOnClickListener() {
val result_text_view = findViewById<TextView>(R.id.result_text)
val cls_clear_text = clear_text()
cls_clear_text.clear(result_text_view)
}
}
}
clear_text 기능도 완전히 동일합니다.
Emulator로 실행시켜보면 위처럼 나오고
SHOW TEXT 버튼을 눌렀을 때 I like apple.이라는 글자가 제대로 표시되며
CLEAR TEXT 버튼을 누르면 텍스트가 사라지는 것을 알 수 있습니다.
제대로 작동되죠?
import는 Package 파일들 사이끼리도 가능합니다.
동일하게 위처럼 functions.kt 파일을 생성해봅시다.
functions.kt
package com.example.test.functions
class funcions {
val show_text_2 = show_text() // 1
val clear_text_2 = com.example.test.functions.clear_text() // 2
}
functions.kt에서는 clear_text.kt, show_text.kt 두 파일의 class를 가져올것입니다.
1. show_text_2 변수에 show_text() class를 할당하고 있습니다. 여기서 말하는 show_text() class는 show_text.kt 파일에 있는 show_text class입니다.
이렇게 Android Studio는 프로젝트에서 선언된 class를 기본적으로 인식하고 있기 때문에 class의 이름만 적어도 되며, functions.kt와 show_text.kt는 동일한 package 내에 있기 때문에 별도의 import도 필요 없습니다.
2. clear_text_2 변수에 clear_text() class를 할당하고 있습니다.
1번과는 다르게 cleat_text가 있는 package까지 명시해줬습니다. 다만 package의 위치를 적어줬을 뿐 1번과 다른 것은 없습니다.
또한 한가지 주의할 점은 com.example.test.functions.clear_text()를 보면 마치 functions package에 있는 clear_text.kt 파일을 의미하는 것 같지만 아닙니다. 파일명은 무시되고 clear_text.kt 파일에 있는 clear_text class를 의미한다는 것을 알아둡시다.
MainActivity.kt
package com.example.test
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.example.test.functions.funcions
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val btn_show_text = findViewById<Button>(R.id.btn_show_text)
btn_show_text.setOnClickListener() {
val result_text_view = findViewById<TextView>(R.id.result_text)
val func = funcions()
func.show_text_2.show(result_text_view)
}
val btn_clear_text = findViewById<Button>(R.id.btn_clear_text)
btn_clear_text.setOnClickListener() {
val result_text_view = findViewById<TextView>(R.id.result_text)
val func = funcions()
func.clear_text_2.clear(result_text_view)
}
}
}
이제 MainActivity.kt에서도 show_text.kt, clear_text.kt를 각각 import하는 것이 아니라 functions.kt를 import하는 방식으로 바꿔야합니다.
코드는 위와 같으며 분리해서 알아봅시다.
...
import com.example.test.functions.funcions // 4-1
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
val btn_show_text = findViewById<Button>(R.id.btn_show_text) // 1
btn_show_text.setOnClickListener() { // 2
val result_text_view = findViewById<TextView>(R.id.result_text) // 3
val func = funcions() // 4
func.show_text_2.show(result_text_view) // 5
}
...
}
}
먼저 show text button입니다.
1. btn_show_text 변수에 id = btn_show_text인 Button View를 할당합니다.
2. Button이 클릭했을 때 발생할 동작을 위해 setOnClickListener를 설정합니다.
3. result_text_view 변수에 text가 표시될 TextView를 할당합니다.
4. func 변수에 functions class를 할당합니다.
마찬가지로 4-1 부분을 보면 functions class가 자동으로 import되었습니다.
5. func 변수는 functions class를 받았으니 functions class에 있는 show_text_2 속성을 사용할 수 있습니다.
show_text_2 속성은 show() method를 가지고 있으므로 show() method를 실행합니다.
...
import com.example.test.functions.funcions
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
val btn_clear_text = findViewById<Button>(R.id.btn_clear_text)
btn_clear_text.setOnClickListener() {
val result_text_view = findViewById<TextView>(R.id.result_text)
val func = funcions()
func.clear_text_2.clear(result_text_view)
}
}
}
이것도 마찬가지이므로 한번 천천히 봐봅시다.
여기까지 적고 앱을 실행시켜보면 잘 작동되는 것을 확인할 수 있습니다.
'Android' 카테고리의 다른 글
Android Studio - apk 파일 만들기 (0) | 2021.05.23 |
---|---|
Android Studio - getString() (strings.xml로부터 문자 받아오기) (0) | 2021.04.06 |
Android Studio - setImageResource (Image View에 image 셋팅해주기) (0) | 2021.03.23 |
Android Studio - 주사위 굴리기 (0) | 2021.03.23 |
Android Studio - setOnClickListener (버튼 클릭 시 수행할 동작 지정하기) (0) | 2021.03.23 |