[TIL] 선발대 2,3주차 정리

[TIL] 선발대 2,3주차 정리

이번주 과제

  • Todo 탭이 활성화 될때만 FAB가 보여지게 처리

  • Todo 탭이 아닌 경우 FAB은 사라져야함
    • 💡 ViewPager의 changed 리스너를 활용해서, FAB의 hide()/show()를 이용해보세요.
  • FAB를 눌러서 Todo 추가 화면을 노출 시키고, 제목과 내용을 입력해서 Todo탭에 반영
    • 레지스터포 액티비티 리저트를 사용해 데이터를 주고받기

1) FAB 버튼 숨기기

  • 메인 어댑터에서 프래그먼트를 가져오는 함수 만들기

    fun getFragment(position: Int): Fragment {
        return fragments[position].fragment
    }
    
  • 메인에서 registerOnPageChangeCallback 사용하여 onPageSelected 함수 사용하기

    viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
      
                override fun onPageSelected(position: Int) {
                    //프래그먼트의 포지션을 가져와 버튼 보여주고 숨기기
                    super.onPageSelected(position)
                    //is 키워드 사용으로 프래그먼트 한정하기
                    if (viewPagerAdapter.getFragment(position) is TodoFragment) {
                        fabAddTodo.show()
                    } else {
                        fabAddTodo.hide()
                    }
                }
            })
    

2) FAB 클릭으로 item 추가하기

  • TodoAddActivity 만들기 , 레이아웃까지 함께 만들기

    class TodoAddActivity : AppCompatActivity() {
      
        private lateinit var binding: TodoAddActivityBinding
      
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = TodoAddActivityBinding.inflate(layoutInflater)
            setContentView(binding.root)
      
            initView()
        }
      
        private fun initView() = with(binding) {
      
              
        }
    }
    
  • 데이터 받아오는 부분 만들기

    //등록 버튼 눌러 intent로 데이터 받아오기
            submit.setOnClickListener {
                //scope function apply사용
                val intent = Intent().apply {
                		//데이터 클래스를 넘겨주는 방법임
                    putExtra(
                        EXTRA_MODEL, TodoModel(
                            todoTitle.text.toString(),
                            todoDescription.text.toString()
                        )
                    )
                }
                setResult(Activity.RESULT_OK, intent)
                finish()
            }
        }
    
    • 데이터 클래스를 인텐트 객체로 넘기기 위해서는

    • gradle> plugins 에 넣어줘야할 값이 있음.

      id 'kotlin-parcelize'
      id 'kotlin-android'
      
    • 데이터 클래스에서 parcelize를 상속 해줘야함.

      @Parcelize
      data class TodoModel(
          val title: String?,
          val description: String?
      ) : Parcelable
      
  • 인텐트를 얻을 수 있도록 함수 만들어주기

    companion object {
        //메인 엑티비티에서도 사용하기 위해 변하지 않는 상수값으로 지정해줌
        const val EXTRA_MODEL = "extra_model"
      
        fun newIntent(context: Context) = Intent(context, TodoAddActivity::class.java)
    }
    
  • 메인 액티비티로 돌아가 registerForActivityResult 런쳐 만들어주기 (버튼을 눌렀을때 액티비티에 대한 결과를 받을 수 있음)

    private val addToDoLauncher =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
             
        }
    
    private val addToDoLauncher =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == Activity.RESULT_OK) {
                val todoModel = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                    result.data?.getParcelableExtra(
                        TodoAddActivity.EXTRA_MODEL,
                        TodoModel::class.java
                    )
                } else {
                    result.data?.getParcelableExtra(
                        TodoAddActivity.EXTRA_MODEL
                    )
                }
      
                val todoFragment = viewPagerAdapter.getFragment(0) as? TodoFragment
                //아이템 추가하기
                todoFragment?.setTodoContent(todoModel)
            }
        }
    
  • 버튼 눌렀을때 결과를 가져올 수있도록 연결해주기

    // fab
    fabAddTodo.setOnClickListener {
        addToDoLauncher.launch(
            TodoAddActivity.newIntent(this@MainActivity)
        )
    }
    
  • TodoListAdapter에 아이템을 추가할 수 있는 함수 만들기

    fun addItem(todoModel: TodoModel?) {
            if (todoModel == null) {
                return
            }
      
            list.add(todoModel)
            //전체 사이즈의 첫번째에 추가가 되도록
            notifyItemChanged(list.size - 1)
        }
    
  • TodoFragment에 item을 추가할 수 있는 함수 만들어주기

      fun setTodoContent(todoModel: TodoModel?) {
    listAdapter.addItem(todoModel)
      }
    

© 2023. All rights reserved.

AgileCatch