탐색 구성요소는 탐색 그래프를 사용하여 앱의 탐색을 관리합니다. 탐색 그래프는 사용자가 한 대상에서 다른 대상으로 이동하기 위해 실행할 수 있는 작업 또는 논리적 연결과 함께 앱의 모든 대상이 포함된 리소스 파일입니다. Android 스튜디오의 Navigation Editor를 사용하여 앱의 탐색 그래프를 관리할 수 있습니다.
이 주제에는 앱의 탐색 그래프를 디자인하기 위한 권장사항 및 추천사항이 포함되어 있습니다.
최상위 수준 탐색 그래프
앱의 최상위 수준 탐색 그래프는 사용자가 앱을 실행할 때 표시되는 최초 대상으로 시작해야 하며 앱에서 이동할 때 보게 되는 대상을 포함해야 합니다.
그림 1. 최상위 수준의 탐색 그래프
중첩 그래프
일반적으로 앱 내의 로그인 흐름, 마법사 또는 기타 하위 흐름은 중첩 탐색 그래프로 가장 잘 표현됩니다.
이런 방식으로 자체 포함된 하위 탐색 흐름을 중첩하면 앱 UI의 기본 흐름을 더 쉽게 이해하고 관리할 수 있습니다. 또한 중첩 그래프는 재사용할 수 있습니다. 중첩 그래프는 캡슐화 수준도 제공하므로 중첩 그래프 외부의 대상이 중첩 그래프 내의 대상에 직접 액세스할 수 없습니다. 대신 대상은 내부 로직이 그래프의 나머지 부분에 영향을 주지 않고 변경될 수 있는 중첩 그래프 자체로 navigate()
해야 합니다.
한 예로 그림 1의 최상위 수준 탐색 그래프를 사용하여 앱이 처음 실행될 때만 사용자에게 title_screen 및 register 화면이 표시되도록 한다고 가정해 보겠습니다. 그 뒤에 사용자 정보가 저장되고 차후에 앱이 실행될 때 사용자는 match 화면으로 바로 이동되어야 합니다. 그림 2와 같이 match 화면을 최상위 수준 탐색 그래프의 시작 대상으로 설정하고 제목 화면과 register 화면을 중첩 그래프로 이동하는 것이 좋습니다.
그림 2. 이제 최상위 탐색 그래프에 중첩 그래프가 포함됨
match 화면이 시작되면 등록된 사용자가 있는지 확인할 수 있습니다. 사용자가 등록되지 않은 경우 사용자를 등록 화면으로 이동할 수 있습니다. 조건부 탐색 시나리오에 관한 자세한 내용은 조건부 탐색을 참고하세요.
그래프 구조를 모듈화하는 또 다른 방법은 상위 탐색 그래프의 <include>
요소를 통해 다른 그래프 내에 한 그래프를 포함하는 것입니다. 이렇게 하면 포함된 그래프는 별도의 모듈 또는 프로젝트에 함께 정의되어 재사용성이 극대화됩니다.
라이브러리 모듈 간 탐색
앱이 라이브러리 모듈에 종속되어 있고 모듈 안에 포함된 탐색 그래프가 있다면 <include>
요소를 사용하여 이러한 탐색 그래프를 참조할 수 있습니다.
자세한 내용은 다중 모듈 프로젝트를 위한 탐색 권장사항을 참고하세요.
전역 작업
둘 이상의 경로를 통해 도달할 수 있는 앱의 대상에는 이 대상으로 이동하도록 정의된 해당 전역 작업이 있어야 합니다. 전역 작업은 어디서든 대상으로 이동하는 데 사용될 수 있습니다.
이를 라이브러리 모듈 샘플에 적용해 보겠습니다. 이 모듈 샘플에는 동일한 작업이 승리와 게임 종료 대상 모두에 정의되어 있습니다. 아래 예와 같이 이러한 공통 작업을 단일 전역 작업으로 추출하여 두 대상 모두에서 참조해야 합니다.
<?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/in_game_nav_graph"
app:startDestination="@id/in_game">
<!-- Action back to destination which launched into this in_game_nav_graph-->
<action android:id="@+id/action_pop_out_of_game"
app:popUpTo="@id/in_game_nav_graph"
app:popUpToInclusive="true" />
<fragment
android:id="@+id/in_game"
android:name="com.example.android.gamemodule.InGame"
android:label="Game">
<action
android:id="@+id/action_in_game_to_resultsWinner"
app:destination="@id/results_winner" />
<action
android:id="@+id/action_in_game_to_gameOver"
app:destination="@id/game_over" />
</fragment>
<fragment
android:id="@+id/results_winner"
android:name="com.example.android.gamemodule.ResultsWinner" />
<fragment
android:id="@+id/game_over"
android:name="com.example.android.gamemodule.GameOver"
android:label="fragment_game_over"
tools:layout="@layout/fragment_game_over" />
</navigation>
자세히 알아보려면 탐색 문서의 전역 작업 및 프래그먼트의 전역 작업을 사용하는 방법의 예를 참고하세요.