안드로이드 코틀린 : 일반 클래스 또는 Fragment에서 MainActivity의 메서드 사용하기
Lucy Archive
Lucy / Facilitate4U
2021. 4. 5. 01:54

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에 데이터를 주고 받거나 작업을 요청하기 위해 많이 사용하는 방법 중의 하나입니다.

Fragment에서 Fragment 데이터 주고 받기

 

안드로이드 코틀린 : Fragment에서 Fragment 생성 및 데이터 보내기

Android Kotlin : 프래그먼트에서 프래그먼트에 데이터 보내기(작업 요청하기) 지난 포스트에서는 Activity에서 Fragment 생성시 또는 생성된 Fragment에 데이터를 전송하는 방법에 대해 소개하였습니다.

juahnpop.tistory.com

 

일반 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() 메서드가 동작하는 구조 입니다. 

실행 결과

끝까지 읽어 주셔서 감사합니다.^^

관련포스트

🤞 안드로이드(코틀린) 앱 제작하기 관련글 목록 보기

🤞 안드로이드(코틀린) 코틀린:클래스 관련글 목록 보기