대상 만들기

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

기존 프래그먼트 또는 활동에서 대상을 만들 수 있습니다. 또한, 탐색 편집기를 사용하여 새 대상을 만들거나 자리표시자를 만들어 추후 프래그먼트 또는 활동으로 교체할 수 있습니다.

기존 프래그먼트 또는 활동에서 대상 만들기

탐색 그래프에 추가하려는 기존 대상 유형이 있다면 탐색 편집기에서 New Destination 을 클릭한 다음 표시되는 드롭다운에서 해당 대상을 클릭합니다. 이제 탐색 그래프의 Design 뷰에서 대상의 미리보기를 볼 수 있으며 Text 뷰에서 대상에 해당하는 XML을 볼 수 있습니다.

새 프래그먼트 대상 만들기

탐색 편집기를 사용하여 새 대상 유형을 추가하려면 다음을 실행합니다.

  1. 탐색 편집기에서 New Destination 아이콘 을 클릭한 다음 Create new destination을 클릭합니다.
  2. New Android Component 대화상자가 표시되면 프래그먼트를 만듭니다. 프래그먼트에 관한 자세한 내용은 프래그먼트 문서를 참조하세요.

다시 탐색 편집기에서 Android 스튜디오가 이 대상을 그래프에 추가한 것을 확인할 수 있습니다.

그림 1은 대상 및 자리표시자 대상의 예를 보여줍니다.

그림 1. 대상 및 자리표시자

DialogFragment에서 대상 만들기

기존 DialogFragment가 있다면 다음 예와 같이 <dialog> 요소를 사용하여 탐색 그래프에 대화상자를 추가할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/nav_graph">

...

<dialog
    android:id="@+id/my_dialog_fragment"
    android:name="androidx.navigation.myapp.MyDialogFragment">
    <argument android:name="myarg" android:defaultValue="@null" />
        <action
            android:id="@+id/myaction"
            app:destination="@+id/another_destination"/>
</dialog>

...

</navigation>

새 활동 대상 만들기

Activity 대상을 만드는 방법은 Fragment 대상을 만드는 방법과 비슷합니다. 하지만 Activity 대상의 특성은 상당히 다릅니다.

기본적으로 탐색 라이브러리는 NavControllerActivity 레이아웃에 연결하고, 활성 탐색 그래프는 범위가 활성 Activity로 지정됩니다. 사용자가 다른 Activity로 이동하면 현재 탐색 그래프는 더 이상 범위에 포함되지 않습니다. 즉, Activity 대상은 탐색 그래프의 엔드포인트로 간주되어야 합니다.

Activity 대상을 추가하려면 정규화된 클래스 이름으로 대상 Activity를 지정합니다.

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">

    <activity
        android:id="@+id/sampleActivityDestination"
        android:name="com.example.android.navigation.activity.DestinationActivity"
        android:label="@string/sampleActivityTitle" />
</navigation>

이 XML은 다음 startActivity() 호출과 동일합니다.

Kotlin

startActivity(Intent(context, DestinationActivity::class.java))

자바

startActivity(new Intent(context, DestinationActivity.class));

이 접근법이 적합하지 않은 경우도 있습니다. 예를 들어 활동 클래스에 관한 컴파일 시간 종속 항목이 없거나, 암시적 인텐트를 거치는 간접 수준을 선호할 수 있습니다. 대상 Activity의 매니페스트 항목에서 intent-filterActivity 대상을 어떻게 구조화해야 하는지를 나타냅니다.

예를 들어 다음 매니페스트 파일을 살펴보겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.navigation.activity">
    <application>
        <activity android:name=".DestinationActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <data
                    android:host="example.com"
                    android:scheme="https" />
                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

관련 Activity 대상은 매니페스트 항목에 있는 속성과 일치하는 actiondata 속성으로 구성해야 합니다.

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">
    <activity
        android:id="@+id/localDestinationActivity"
        android:label="@string/localActivityTitle"
        app:action="android.intent.action.VIEW"
        app:data="https://example.com"
        app:targetPackage="${applicationId}" />
</navigation>

targetPackage를 현재 applicationId로 지정하면 기본 앱을 포함한 현재 애플리케이션으로 범위가 제한됩니다.

특정 앱을 대상으로 지정하려는 경우에도 이 메커니즘을 사용할 수 있습니다. 다음 예에서는 com.example.android.another.appapplicationId를 갖는 앱을 대상으로 정의합니다.

<?xml version="1.0" encoding="utf-8"?>`
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">
    <activity
        android:id="@+id/localDestinationActivity"
        android:label="@string/localActivityTitle"
        app:action="android.intent.action.VIEW"
        app:data="https://example.com"
        app:targetPackage="com.example.android.another.app" />
</navigation>

동적 인수

이전 예에서는 대상으로 이동하는 데 고정 URL을 사용했습니다. 추가 정보가 URL의 일부로 전송되는 동적 URL을 지원해야 할 수도 있습니다. 예를 들어 https://example.com?userId=<actual user ID>와 유사한 형식의 URL로 사용자 ID를 보내기도 합니다.

이때 data 속성 대신 dataPattern을 사용합니다. 그런 다음 dataPattern 값에서 명명된 자리표시자로 대체할 인수를 제공합니다.

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">
    <activity
        android:id="@+id/localDestinationActivity"
        android:label="@string/localActivityTitle"
        app:action="android.intent.action.VIEW"
        app:dataPattern="https://example.com?userId={userId}"
        app:targetPackage="com.example.android.another.app">
        <argument
            android:name="userId"
            app:argType="string" />
    </activity>
</navigation>

이 예에서는 Safe Args 또는 Bundle을 사용하여 userId 값을 지정할 수 있습니다.

Kotlin

navController.navigate(
    R.id.localDestinationActivity,
    bundleOf("userId" to "someUser")
)

자바

Bundle args = new Bundle();
args.putString("userId", "someUser");
navController.navigate(R.id.localDestinationActivity, args);

이 예에서는 someUser{userId}로 대체하고 https://example.com?userId=someUser의 URI 값을 만듭니다.

자리표시자 대상

자리표시자를 사용하여 구현되지 않은 대상을 나타낼 수 있습니다. 자리표시자는 대상을 시각적으로 표현하는 역할을 합니다. 탐색 편집기에서 다른 대상과 마찬가지로 자리표시자를 사용할 수 있습니다.