업데이트:

카테고리:

/

태그: , , ,

무엇을 배우는가?

  1. Bundle을 설치해서 사용해보기
  2. Safe Args Gradle 플러그인 사용해보기
  3. “share” 해보기

1. Safe Args

데이터를 보낼 때 유형 안정성을 보장하므로 데이터를 탐색하고 전달할 때는 Safe Args를 사용하는 것이 좋다.

  1. 의존성 추가
    project
     dependencies {
       ...
       classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigationVersion"
     }
    

    Module

     apply plugin: 'androidx.navigation.safeargs'
    

    이렇게 하면 프로젝트에 NavDirection클래스를 생성할 수 있다.

  2. 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가지의 통신방법이 있다.

  1. 명시적(explicit) Intent 앱의 화면전환을 하는 방법으로, 하나의 액티비티에서 다른 액티비티로 화면 전환시 사용한다.

  2. 암시적(Implicit) Intent Action에 따라 해당하는 적합한 애플리케이션의 클래스를 호출한다.
    웹브라우저 호출, 이메일 전송, 전화앱으로의 통화…이 있다.

그러므로 우리가 사용해야될 공유는 암시적 Intent를 사용하여 SNS로 공유를 해야한다.

3. 게임 결과 공유

  1. 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()를 호출하면 사용자가 어느 앱을 통해서 콘텐츠를 공유할 지 선택할 수 있다.

  2. 공유버튼 및 연결
     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가 제대로 설정되어있는지 확인하자