경험의 기록

developer.android.com/guide/navigation/navigation-getting-started

 

탐색 구성요소 시작하기  |  Android 개발자  |  Android Developers

이 주제는 탐색 구성요소를 설정하고 사용하는 방법을 설명합니다. 탐색 구성요소의 대략적인 개요는 탐색 개요를 참고하세요. 환경 설정 참고: 탐색 구성요소는 Android 스튜디오 3.3 이상이 필요

developer.android.com

안드로이드 제트팩에서 제공하는 Navigation을 사용하면

프래그먼트를 더 직관적이고 편리하게 관리할 수 있다.

그래프를 통해 흐름을 한눈에 파악할 수 있다.


Navigation 사용하기

dependencies 추가

def nav_version = "2.3.3"

    // Kotlin
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

bulid.gradle 에 코틀린용 코드를 추가해준다.

 

 

Navigation graph 추가

res > new > Android Resource File 에서 resource typeNavigation 으로 추가해준다.

 

 

프래그먼트 추가

완성된 그래프에 프래그먼트들을 추가해준다.

 

 

사용할 액티비티에 프래그먼트 컨테이너 추가

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/game_navigation" />

이 액티비티에 프래그먼트들이 담긴다.

 

 

프래그먼트 연결

드래그해서 프래그먼트가 동작할 방식대로 연결해준다.

    <fragment
        android:id="@+id/gameSelectFragment"
        android:name="com.hanyeop.braintest.gamefragment.GameSelectFragment"
        android:label="fragment_game_select"
        tools:layout="@layout/fragment_game_select" >
        <action
            android:id="@+id/action_gameSelectFragment_to_numberGameFragment"
            app:destination="@id/numberGameFragment" />
    </fragment>
    <fragment
        android:id="@+id/numberGameFragment"
        android:name="com.hanyeop.braintest.gamefragment.NumberGameFragment"
        android:label="fragment_number_game"
        tools:layout="@layout/fragment_number_game" >
        <action
            android:id="@+id/action_numberGameFragment_to_resultFragment"
            app:destination="@id/resultFragment" />
    </fragment>
    <fragment
        android:id="@+id/resultFragment"
        android:name="com.hanyeop.braintest.gamefragment.ResultFragment"
        android:label="fragment_result"
        tools:layout="@layout/fragment_result" >
        <action
            android:id="@+id/action_resultFragment_to_numberGameFragment"
            app:destination="@id/numberGameFragment" />
        <action
            android:id="@+id/action_resultFragment_to_gameSelectFragment2"
            app:destination="@id/gameSelectFragment" />
    </fragment>

action 을 이용하여 넣어도되고, 드래그하면 action 코드가 자동으로 추가된다.

예시로 게임선택창 -> 선택된 게임 -> 결과창에서 다시하기or메인으로 돌아가기를 추가했다.

 

 

사용하기

class GameActivity : AppCompatActivity() {

    lateinit var navController : NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_game)

        // 전 액티비티에서 발견한 NavHost 연결
        navController = nav_host_fragment.findNavController()
    }
}

아까 추가해준 액티비티에 

lateinit var navController : NavController
navController = nav_host_fragment.findNavController()

를 추가해준다.

또한 setupActionBarWithNavController 를 사용하면 프래그먼트 창에서 뒤로가기 키를 만들 수 있다.

 

그리고 프래그먼트로 와서 동일하게

class GameSelectFragment : Fragment() {

    lateinit var navController : NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_game_select, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // 연결
        navController = Navigation.findNavController(view)

        gameButtonOne.setOnClickListener {
            navController.navigate(R.id.action_gameSelectFragment_to_numberGameFragment)
        }
    }
}

컨트롤러를 추가해주고 원하는 액션을 지정해준다.

 

잘 구현된 것을 확인할 수 있다.

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading