Android NavDirection
업데이트:
카테고리: Android
/태그: args, Intent, NavDirection, Share
무엇을 배우는가?
Bundle
을 설치해서 사용해보기- Safe Args Gradle 플러그인 사용해보기
- “share” 해보기
1. Safe Args
데이터를 보낼 때 유형 안정성을 보장하므로 데이터를 탐색하고 전달할 때는 Safe Args를 사용하는 것이 좋다.
- 의존성 추가
projectdependencies { ... classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigationVersion" }
Module
apply plugin: 'androidx.navigation.safeargs'
이렇게 하면 프로젝트에
NavDirection
클래스를 생성할 수 있다. - NavDirection
// 이전 view.findNavController().navigate(R.id.action_gameFragment_to_gameOverFragment) // 이후 view.findNavController().navigate(GameFragmentDirections.actionGameFragmentToGameOverFragment())
R.id
->GameFragmentDirections
으로 교체되었다.이러면 navigation에 인자를 넘겨줄 수 있어 데이터를 주고 받아 사용할 수 있게 된다.
2. Naviogation 파일에 args 추가
파일에 있는 Fragment를 클릭하면 Argument를 추가할 수 있다.
추가한 후 앱을 실행하면 No value passed for ...
가 발생하게 되는데 이것은 navigate의 인자가 제대로 넘어가지 않아서 발생하게 된다.
val args = GameWonFragmentArgs.fromBundle(requireArguments())
Toast.makeText(context, "NumCorrect: ${args.numCorrect}, NumQuestions: ${args.numQuestions}", Toast.LENGTH_LONG).show()
navigation에 연결된 args를 꺼내서 프로젝트 내에서 사용할 수 있다.
Intent
간단한 메세지 객체로 컴포넌트 간의 통신을 맡고 있고 2가지의 통신방법이 있다.
-
명시적(explicit) Intent 앱의 화면전환을 하는 방법으로, 하나의 액티비티에서 다른 액티비티로 화면 전환시 사용한다.
-
암시적(Implicit) Intent Action에 따라 해당하는 적합한 애플리케이션의 클래스를 호출한다.
웹브라우저 호출, 이메일 전송, 전화앱으로의 통화…이 있다.
그러므로 우리가 사용해야될 공유는 암시적 Intent를 사용하여 SNS로 공유를 해야한다.
3. 게임 결과 공유
- Intent 함수를 제작
private fun getShareIntent() : Intent { val args = GameWonFragmentArgs.fromBundle(requireArguments()) val shareIntent = Intent(Intent.ACTION_SEND) shareIntent.setType("text/plain").putExtra(Intent.EXTRA_TEXT, getString(R.string.share_success_text, args.numCorrect, args.numQuestions)) return shareIntent }
GameWonFragmentArgs
의 인자를 가져온다.
공유할 컨텐츠를 intent로 만들기 위해ACTION_SEND
의 작업이 있는 Intent를 호출한다.
해당 인텐트로startActivity()
를 호출하면 사용자가 어느 앱을 통해서 콘텐츠를 공유할 지 선택할 수 있다. - 공유버튼 및 연결
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.winner_menu, menu) if(getShareIntent().resolveActivity(requireActivity().packageManager)==null){ menu.findItem(R.id.share).isVisible = false } } override fun onOptionsItemSelected(item: MenuItem): Boolean { when(item.itemId){ R.id.share -> shareSuccess() } return super.onOptionsItemSelected(item) }
onCreateOptionsMenu
은 옵션메뉴가 처음 생성될 때 사용하는 메서드이다.
기본적으로 메서드는 오버라이딩하여 사용한다.
inflater.inflate
는 xml의 표기된 레이아웃을 객체화 시키는 작업이다.메뉴버튼이 보이지 않는다면
setHasOptionsMenu
가 제대로 설정되어있는지 확인하자