Android Kotlin : 일반 Class에서 MainActivity의 프로퍼티 및 메서드 사용하기
일반 Class 와 Fragment에서 MainActivity의 메서드 및 프로퍼티 사용 방법
에 대해 작성하였습니다.
Fragment 에서 MainActivity 메서드 사용 방법
MainActivity 클래스에 아래와 같이 printHello()가 있다고 가정합니다.
package com.blacklog.mainactivitymethod
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun printHello(){
Toast.makeText(this, "Hello", Toast.LENGTH_LONG).show()
}
}
Fragment에서 MainActivity의 printHello() 메서드를 호출 하기 위해, onAttach 콜백 함수의 인자로 사용된 context를 MainActivity로 캐스팅해서 MainActivity 인스턴스를 생성 후 메서드를 호출합니다.
package com.blacklog.mainactivitymethod
import android.content.Context
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
class BlankFragment : Fragment() {
lateinit var mainActivity : MainActivity
override fun onAttach(context: Context) {
super.onAttach(context)
mainActivity = context as MainActivity
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
mainActivity.printHello()
return inflater.inflate(R.layout.fragment_blank, container, false)
}
}
이 방법은 아래 링크와 같이 Fragment에서 Fragment에 데이터를 주고 받거나 작업을 요청하기 위해 많이 사용하는 방법 중의 하나입니다.
일반 Class에서 MainActivity 메서드 사용방법
MainActivity.kt
MainActivity 클래스 내의 companion object{} 내에서 자신의 인스턴스를 반환하는 getInstance() 메서드를 등록합니다. 코틀린 클래스의 companion object 는 인스턴스를 생성하지 않고, 바로 사용 할 수 있는 프로퍼티와 메서드의 집합입니다.
package com.blacklog.mainactivitymethod
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
class MainActivity : AppCompatActivity() {
init{
instance = this
}
companion object{
private var instance:MainActivity? = null
fun getInstance(): MainActivity? {
return instance
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val subClass = SubClass()
subClass.printHello()
}
fun printHello(){
Toast.makeText(this, "Hello", Toast.LENGTH_LONG).show()
}
}
위의 코드는 MainActivity 실행시 SubClass 클래스의 printHello() 메서드를 호출하게 되어 있습니다.
SubClass.kt
일반 클래스에서 MainActivity의 메서드를 사용하기 위해 MainActivity의 companion object에 선언된 getInstance() 함수로 인스턴스를 생성해서 메서드를 호출합니다.
package com.blacklog.mainactivitymethod
class SubClass {
private val mainActivity = MainActivity.getInstance()
fun printHello(){
mainActivity?.printHello()
}
}
MainActivity의 메서드를 한번만 쓰고, 별도의 인스턴스 생성이 필요하지 않은 경우 아래와 같이 코드를 작성해도 무방합니다.
package com.blacklog.mainactivitymethod
class SubClass {
fun printHello(){
MainActivity.getInstance()?.printHello()
}
}
실행 결과
위 코드를 실행하면 아래와 같이 MainActivity 실행시 "Hello" 토스트 메세지가 출력되는 것을 확인 할 수 있습니다. MainActivity에서 SubClass의 printHello() 메서드를 호출하고 그 결과로 MainActivity의 printHello() 메서드가 동작하는 구조 입니다.
끝까지 읽어 주셔서 감사합니다.^^
'Programming > Android App(Kotlin)' 카테고리의 다른 글
안드로이드 코틀린 : 사진의 Exif 데이터 읽기, 쓰기 - ExifInterface (0) | 2021.04.08 |
---|---|
안드로이드 코틀린 : CameraX 로 사진 촬영하기 (3) | 2021.04.05 |
안드로이드 코틀린 : 카메라 사진 찍기, 내부저장소, 외부저장소, 공용저장소 저장 방법 with FileProvider (5) | 2021.04.05 |
안드로이드 코틀린 : RecyclerView로 목록 만들기(with ViewBinding) (2) | 2021.03.31 |
안드로이드 코틀린 : Spinner 로 목록 만들기 및 기타 설정 방법 (0) | 2021.03.30 |