마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

TabLayout의 탭에 단순 타이틀 셋팅에도 뷰모델이 필요할까요?

0 추천

MVVM 패턴을 최대한 적용해서하느라 어떻게 해야할지 감이 잘안오는데..

단순 TabLayout의 Tab의 타이틀을 셋팅하는데에도 뷰모델의 LiveData나 oberserve 클래스같은것이 필요할까

요?

제 앱에서는 탭레이아웃의 타이틀이라는게 한번 세팅되고 변하지 않습니다.

그런데 LiveData나 oberserver 를 사용하면 라이브데이터의 변화를 관찰해서 뷰를 업데이트 하잖아요?

그런데 탭이라는게 여러 탭에 존재하고 한번에 세팅되다보니까 이게 맞는지 observer를 사용하는게

맞는지 모르겠습니다...

아니면 MVVM 패턴에서 꼭 LiveData, Databinding 같은것을 사용할 필요는 없다고 들었습니다.. 

그래서 생각해본게 탭의 타이틀에 MVVM 패턴을 적용하려면 뷰모델 클래스에 tab의 position값을 넘긴후에 

viewmodel 클래스에서 positioin 값에 맞는 타이틀값을 넘겨받아 뷰에 셋팅하면 될까요?

 

일단 어떻게 해야할지 몰라 livedata와 observe 를 사용한 코드는 올려놓겠습니다.

class WorkoutListTabFragment : Fragment() {
    private var _binding: FragmentWorkoutListTabBinding? = null
    private val binding get() = _binding!!
    private lateinit var adapter: WorkoutListPagerAdapter
    private val viewModel: WorkoutListTabViewModel by viewModels { WorkoutListTabViewModelFactory() }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        _binding = FragmentWorkoutListTabBinding.inflate(inflater, container, false)

        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        adapter = WorkoutListPagerAdapter(this)
        binding.apply {
            pager.adapter = adapter
            TabLayoutMediator(tabs, pager) { tab, position ->
                
                tab.text = "TEST${(position+1)}" // TODO: set Tab Title
            }.attach()
        }
        viewModel.tab.observe(viewLifecycleOwner) {

        }
    }
    override fun onDestroy() {
        super.onDestroy()
        _binding = null
    }
}

 

class WorkoutListTabViewModel : ViewModel(){
    private val _tab = MutableLiveData<String>()
    val tab get() = _tab
    private val list = listOf(
        "CHEST", "BACK", "LEG", "SHOULDER", "BICEPS", "TRICEPS", "ABS"
    )

    fun set(pos: Int) {
        _tab.value = list[pos]
    }
}

 

codeslave (3,940 포인트) 님이 2021년 6월 30일 질문
codeslave님이 2021년 6월 30일 수정

1개의 답변

0 추천
아니오. 그냥 static 한 거라면 XML에서 처리하시면 됩니다. MVVM같은 패턴이 사용되는 주된 이유는 View, Domain, Data 레이어를 서로 분리하려는 목적이 제일 큽니다. 화면에 Domain, Data(API, Database), Platform 등 다른 레이어에서 데이터가 전달되어서 결과를 보여주는 게 아니라면 굳이 ViewModel 같은 데로 집어넣으실 필요는 없다고 보여집니다. 괜히 코드만 복잡해 질 겁니다.
spark (227,530 포인트) 님이 2021년 6월 30일 답변
감사합니다 그런데 xml에서 처리하라는 말씀은 데이터바인딩을 사용하라는 말씀인지요?
xml단에서 Tablyout은 하나인데 탭은 여러개잖아요? 그래서 탭레이아웃에서 여러탭의
타이틀을 처리할수있는게 데이터바인딩밖에 없지 않나싶어서요..
BottomNavigationView를 사용하시는 게 제일 좋은 옵션같구요, 굳이 TabLayout을 쓰실거면 XML에 tab을 넣고 이벤트 처리를 하시거나 동적으로 탭을 추가하시면 됩니다.
...