DarkCircle/Kotlin

3주 차

ujum 2022. 7. 6. 12:03
728x90

코틀린 3강으로 끝내기 - 3편 심리테스트 앱 만들기

걍 따라하면 되고 Error없애는 게 관건

navController = nav_host_fragment 오류

navController = *findNavController*(R.id.*nav_host_fragment*)로 바꾸기

Android studio 홈페이지에서 찾아봤는데 뭐 어쩌라는 건지 뭐때문에 이건되고 저건 안되나 몰라

error: failed linking references

내가 건드린 color는 분명 이름 다바꿨는데 어디서 에러가 났나 했더니

themes.xml, themes.xml(night) 에 color가 죄다 이름이 달랐다.바꾸니까 build는 되는데

킹받는다.. 내가 이거 할려고 백신프로그램 지울 순 없잖아요.. 나중에 폰 연결해야지

btn_next import error

import kotlinx.android.synthetic.main.fragment_main.*

에서 error가 생겨서 [build.gradle] (:app) 에 추가

id 'kotlin-android'

근데도 안됨^^

version변경되면서 kotlin-android.. 지원 안한다고 함 그래서 바뀐 거랑 좋은 점

  • https://thdev.tech/android/2020/10/07/Remove-kotlinx-synthetic/kotlin.android.synthtic 대신에 findViewById 활용 → Android 4.2부터는 Viewbinding 사용
    1. 사용하는 이유
      • view 참조 방법
        • ButterKnife : 외부 라이브러리 사용
        • ViewBinding : 안드로이드 아키텍처 구성요소
        • DataBinding : 뷰결합 + 데이터 결합까지 가진 아키텍처 구성요소
      ⇒ 뷰 참조의 관점에서만 봤을 때 ViewBinding 성능이 제일 좋음
    2. 주요 특징2️⃣ 자동으로 xml 레이아웃 파일의 뷰들이 id와 같은 이름을 가진 멤버변수를 가진 클래스는 그 이름이 규칙적으로 명명되어 만들어짐. 레이아웃 파일의 이름에 맞게 클래스 이름이 만들어짐
    3. activity_xxx.xml ⇒ ActivityXxxBinding fragment_xxx.xml ⇒ FragmentXxxBinding
    4. 1️⃣ xml 레이아웃 파일(activity_main.xml)의 뷰들을 이미 연결(Bind)하고 있는 클래스가 자동으로 만들어져서 개발자가 직접 뷰 참조변수를 만들어서 findViewBy()로 찾아서 연결하는 일련의 모든 작업을 할 필요가 없게 만든 기능
    1. ViewBinding 사용 설정 [build.gradle] (module)
    = 외부 라이브러리가 아니고 안드로이드 아키텍처 구성요소라서 여기서 설정
    1. [MainActivity.kt], [MainFragment.kt]
    [https://developer.android.com/topic/libraries/view-binding?hl=ko#kotlin🔎 binding.btn_next.setOnClickListener
    binding.btnNext.setOnClickListener{
    	navController.navigate(R.id.action_mainFragment_to_questionFragment)
    }
    
  • ⇒ binding.btnNext.setOnClickListener로 바꿔써야 한다(킹받,,)
  • 이거보고 차근차근 다 바꿈 아아 걍 문제 덩어리자식 욱여넣어놔서 다시 이해필요
  • viewBinding{ enabled = true }
  • https://kitesoft.tistory.com/108
  1. [QuestionFragment.kt], [SelectionFragment.kt], [ResultFragement.kt]
  • binding을 위한 변수 설정 : .xml에서의 id를 가져오기 위해 FragmentXxxBinding 잘 바꿔줘야 함
  • class ResultFragment : Fragment() { private var _binding : FragmentResultBinding? = null private val binding get() = _binding!! ..
  • 화면 전환을 여기서 하는 것 같음
    • inflate 가 뭔지 다시 알아보기
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentQuestionBinding.inflate(inflater, container, false)
        val view = binding.root
    return view
    }
    
  • view에서 받은 변수 통해서 화면 전환
    • 아 몰라 걍 뭐가 어디서 일어나는지 모르겠다
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        navController = Navigation.findNavController(view)
    
        binding.btnNext.setOnClickListener(this)
    }
    
  • click 했을 때 btn 종류에 따른 화면 전환onDestroyView() 뭔지 찾아보라
  • override fun onClick(v: View?) { when(v?.id){ R.id.btn_next->{ navController.navigate(R.id.action_questionFragment_to_selectionFragment) } } } override fun onDestroyView() { super.onDestroyView() _binding = null binding.btnNext.setOnClickListener{navController.navigate(R.id.action_questionFragment_to_selectionFragment)} }

Navigation 을 좀 더 효율적으로 쓸 방법이 있을 것 같다 ㅠ 공부해야지~

'DarkCircle > Kotlin' 카테고리의 다른 글

Firebase 연동_google, facebook 로그인  (0) 2022.07.07
Howlstagram error  (0) 2022.07.07
2주 차  (0) 2022.07.06
1주 차  (0) 2022.07.06
참고자료  (0) 2022.07.06