Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Kotlin으로 안드로이드 앱에서 프래그먼트가 액티비티 메서드를 호출하는 방법

이 예제는 Kotlin을 사용하여 안드로이드 앱에서 프래그먼트(Fragment) 내부에서 액티비티(Activity)의 메서드를 호출하는 방법을 보여줍니다. 프래그먼트는 독립적으로 동작할 수 없고 반드시 액티비티에 종속되기 때문에, activity 프로퍼티를 통해 호스트 액티비티에 접근한 뒤 원하는 메서드를 호출하는 방식이 가장 기본적인 패턴입니다.

전체 흐름 요약

핵심 코드는 단 한 줄입니다.

(activity as MainActivity).fragmentMethod()

프래그먼트의 activity 프로퍼티는 현재 프래그먼트를 호스팅 중인 액티비티를 반환하며, 이를 MainActivity 타입으로 캐스팅하면 해당 클래스에 정의된 public 메서드를 자유롭게 호출할 수 있습니다.

1단계 — 새 프로젝트 생성

Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다. 언어는 Kotlin으로 설정합니다.

2단계 — activity_main.xml 레이아웃 작성

res/layout/activity_main.xml에 아래 코드를 추가합니다. 화면 상단에는 타이틀 텍스트가 배치되고, 그 아래 프래그먼트가 교체될 FrameLayout 컨테이너가 위치합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="8dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:text="Tutorials Point"
        android:textAlignment="center"
        android:textColor="@android:color/holo_green_dark"
        android:textSize="32sp"
        android:textStyle="bold" />

    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

3단계 — MainActivity.kt 작성

src/MainActivity.kt에 다음 코드를 추가합니다. 여기서 주목할 부분은 프래그먼트에서 호출될 fragmentMethod() 메서드입니다. 이 메서드가 실행되면 화면에 토스트(Toast) 메시지가 표시됩니다.

import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"

        val fragmentManager = supportFragmentManager
        val fragmentTransaction = fragmentManager.beginTransaction()
        fragmentTransaction.replace(R.id.frameLayout, SampleFragment()).commit()
    }

    fun fragmentMethod() {
        Toast.makeText(
            this@MainActivity,
            "Method called From Fragment",
            Toast.LENGTH_LONG
        ).show()
    }
}

onCreate() 안에서 supportFragmentManager를 사용해 SampleFragmentframeLayout 컨테이너에 추가하는 것도 함께 확인하세요.

4단계 — 프래그먼트 생성

새 프래그먼트를 만들고 아래 두 파일의 코드를 작성합니다.

fragment_sample.xml

프래그먼트 레이아웃에는 화면 중앙에 안내 문구를 보여주는 TextView 하나만 배치합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SampleFragment">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Calling a simple method from Fragment"
        android:textAlignment="center"
        android:textColor="@android:color/background_dark"
        android:textSize="24sp"
        android:textStyle="bold" />

</RelativeLayout>

SampleFragment.kt

뷰가 인플레이트되는 시점인 onCreateView()에서 캐스팅을 통해 액티비티의 메서드를 호출합니다.

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment

class SampleFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view: View = inflater.inflate(R.layout.fragment_sample, container, false)
        (activity as MainActivity?)!!.fragmentMethod()
        return view
    }
}

5단계 — AndroidManifest.xml 확인

androidManifest.xml에 아래와 같이 메인 액티비티가 등록되어 있는지 확인합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.q11">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

실행 및 결과 확인

실제 안드로이드 기기를 컴퓨터에 연결한 상태라고 가정하고 진행합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 버튼을 클릭합니다. 목록에서 연결된 모바일 기기를 선택하면 앱이 설치·실행됩니다.

앱이 실행되면 프래그먼트가 MainActivity에 추가되는 순간 onCreateView()가 호출되고, 곧바로 액티비티의 fragmentMethod()가 실행되어 화면에 "Method called From Fragment"라는 토스트 메시지가 나타나는 것을 확인할 수 있습니다.

참고: 더 안전한 호출 방법

위 예제처럼 강제 캐스팅(!!)은 액티비티가 아직 붙지 않았거나 이미 분리된 경우 NullPointerException을 유발할 수 있습니다. 실무에서는 다음과 같이 안전하게 처리하는 것이 좋습니다.

(activity as? MainActivity)?.fragmentMethod()

또는 프래그먼트와 액티비티 간 통신에는 FragmentResult API나 공유 ViewModel을 활용하는 방법도 권장됩니다. 다만 본 예제처럼 직접 캐스팅 방식은 구조를 이해하기에 가장 직관적이므로 학습용으로 적합합니다.