본문 바로가기
프로그래밍

Android Navigation Component argType, 어떤 타입을 사용할 수 있을까?

by Kongkongpapa 2025. 3. 21.
반응형
SMALL

Android 앱 개발을 하다 보면 Fragment 간에 데이터를 전달해야 하는 경우가 많습니다. 이때 Android Navigation Component의 argType 속성을 사용하면 안전하고 효율적으로 데이터를 전달할 수 있습니다. 하지만 argType으로 어떤 타입을 사용할 수 있는지 궁금하셨던 분들을 위해 자세히 정리해 보았습니다.

argType으로 사용할 수 있는 타입

argType은 Fragment 간에 데이터를 전달할 때 인수의 타입을 지정하는 데 사용됩니다. 사용할 수 있는 타입은 크게 기본 타입, Parcelable 및 Serializable 타입, 배열 타입으로 나눌 수 있습니다.

1. 기본 타입

  • integer: 정수형
  • long: long형
  • float: float형
  • boolean: boolean형
  • string: 문자열
  • reference: 리소스 ID

2. Parcelable 및 Serializable 타입

  • Parcelable 인터페이스를 구현한 클래스의 정규화된 이름
  • Serializable 인터페이스를 구현한 클래스의 정규화된 이름

3. 배열 타입

  • 기본 타입 배열 (예: integer[], string[])
  • Parcelable 배열 (Parcelable 클래스의 정규화된 이름 뒤에 [] 추가)

주의사항

  • 배열 타입은 기본적으로 null 값을 허용합니다.
  • Parcelable 및 Serializable 타입은 기본값을 지원하지 않습니다.

예시

XML
 
<fragment
    android:id="@+id/detailFragment"
    android:name="com.example.DetailFragment"
    android:label="Detail">
    <argument
        android:name="itemId"
        app:argType="integer" />
    <argument
        android:name="user"
        app:argType="com.example.User" />
    <argument
        android:name="itemIds"
        app:argType="integer[]" />
</fragment>

위 예시에서는 다음과 같은 타입의 인수를 전달할 수 있습니다.

  • itemId: 정수형
  • user: com.example.User 클래스 (Parcelable 또는 Serializable 구현)
  • itemIds: 정수형 배열

argType 사용의 장점

argType 속성을 사용하면 다음과 같은 장점이 있습니다.

  • 안전한 타입 보장: 타입이 보장된 방식으로 데이터를 전달하여 런타임 오류를 방지할 수 있습니다.
  • 코드 가독성 향상: 인수의 타입을 명시적으로 지정하여 코드의 가독성을 높일 수 있습니다.
  • 자동 코드 생성: Navigation Component는 argType을 기반으로 안전한 타입의 코드 생성을 지원합니다.

 

그럼 생성된 argument를 Fragment 에서는 어떤식으로 전달할까요?  

kotlin 으로 알아봅시다.

1. arguments 설정 (데이터 전달)

데이터를 전달하는 쪽에서는 Fragment를 생성할 때 arguments에 데이터를 담아 전달합니다. 일반적으로 newInstance()와 같은 팩토리 메서드를 사용하여 Fragment를 생성하고 데이터를 설정합니다.

Kotlin
 
import android.os.Bundle
import androidx.fragment.app.Fragment

class DetailFragment : Fragment() {

    companion object {
        private const val ARG_ITEM_ID = "itemId"
        private const val ARG_USER = "user"

        fun newInstance(itemId: Int, user: User): DetailFragment {
            val fragment = DetailFragment()
            val args = Bundle().apply {
                putInt(ARG_ITEM_ID, itemId)
                putParcelable(ARG_USER, user) // Parcelable 객체 전달
            }
            fragment.arguments = args
            return fragment
        }
    }

    // ... (Fragment 코드)
}

2. arguments 가져와 사용 (데이터 수신)

데이터를 받는 쪽 Fragment에서는 arguments를 통해 데이터를 가져와 사용합니다. onCreate() 또는 onCreateView()와 같은 Fragment의 생명주기 관련 메서드에서 데이터를 가져오는 것이 일반적입니다.

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

class DetailFragment : Fragment() {

    private var itemId: Int? = null
    private var user: User? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            itemId = it.getInt(ARG_ITEM_ID)
            user = it.getParcelable(ARG_USER)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_detail, container, false)
        val itemIdTextView = view.findViewById<TextView>(R.id.item_id_text_view)
        val userNameTextView = view.findViewById<TextView>(R.id.user_name_text_view)

        itemIdTextView.text = "Item ID: $itemId"
        userNameTextView.text = "User Name: ${user?.name}" // user가 null이 아닐 때만 name 접근

        return view
    }

    // ... (Fragment 코드)
}

3. XML 레이아웃 (fragment_detail.xml)

XML
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/item_id_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Item ID: " />

    <TextView
        android:id="@+id/user_name_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="User Name: " />

</LinearLayout>

4. User 클래스 (Parcelable 구현)

Parcelable 객체를 전달하려면 해당 클래스가 Parcelable 인터페이스를 구현해야 합니다. Kotlin에서는 @Parcelize 플러그인을 사용하여 간편하게 구현할 수 있습니다.

Kotlin
 
import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class User(val id: Int, val name: String) : Parcelable

주의사항

  • arguments는 Fragment의 생명주기 관련 메서드에서 접근해야 합니다.
  • arguments는 null을 반환할 수 있으므로 null 체크를 해야 합니다.
  • Parcelable 객체는 putParcelable()과 getParcelable() 메서드를 사용하여 전달하고 가져와야 합니다.
  • Serializable 객체는 putSerializable()과 getSerializable() 메서드를 사용하여 전달하고 가져와야 합니다.

arguments 사용의 장점

  • 안전한 데이터 전달: 타입 안정성을 보장하여 런타임 오류를 방지합니다.
  • 코드 가독성 향상: 데이터를 명시적으로 전달하여 코드의 가독성을 높입니다.
  • Fragment 재사용성 향상: arguments를 통해 데이터를 전달하면 Fragment를 독립적으로 유지하고 재사용성을 높일 수 있습니다.

arguments를 사용하면 Fragment 간에 데이터를 안전하고 효율적으로 전달할 수 있습니다. 다양한 타입을 지원하므로 개발자는 상황에 맞춰 적절한 타입을 선택하여 사용할 수 있습니다.

 

결론

argType 속성을 사용하면 Fragment 간에 데이터를 안전하고 효율적으로 전달할 수 있습니다. 다양한 타입을 지원하므로 개발자는 상황에 맞춰 적절한 타입을 선택하여 사용할 수 있습니다.

반응형
LIST