[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) }