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

MVVM 패턴 적용중에 이 코드에서 어떤 부부을 더 나누면 될까요?

0 추천
class MainActivity : AppCompatActivity(), BodyPartDialogFragment.OnStartClickListener {
    private val viewModel: MainViewModel by viewModels()
    private lateinit var bottomNav: BottomNavigationView
    private lateinit var fm: FragmentManager
    private lateinit var ft: FragmentTransaction
    private var curFrag: Fragment? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        bottomNav = findViewById(R.id.bottom_nav)
        bottomNav?.setOnNavigationItemSelectedListener { menu ->
//            viewModel.setMenuValue(menu)
            fm = supportFragmentManager
            ft = fm.beginTransaction()
            curFrag = fm.primaryNavigationFragment
            val tag: String = menu.toString()
            val id: Int = menu.itemId

            curFrag?.let { cf -> ft.hide(cf) } // cf == curFrag

            var f: Fragment? = fm.findFragmentByTag(tag)

            if(f == null) {
                when (id) {
                    R.id.list -> f = WorkoutListFragment()
                    R.id.calendar -> f = CalendarFragment()
                }
                ft.add(R.id.content_layout, f!!, tag)
            }
            else ft.show(f)

            ft.setPrimaryNavigationFragment(f)
            ft.setReorderingAllowed(true)
            ft.commitNow()
            true
        }
    }

 

 

MVVM 패턴으로 앱을 만들고 있기때문에 코드를 좀 나눌 필요성이 있어보였습니다.

나누려고 시도는 해보았는데.. 막상 나누려고보니 여기서 뭘 더 나눠야할지 모르겠습니다..

 

사실 딱히 건드린건 없는데 말이죠.

보시면 f나 fm, ft 전부 뷰와 관련된것들이라 액티비티가 뷰이므로 여기서 작성해야하는 것이 맞나 싶은데

코드가 너무 많은것 같아서 이게 맞나싶구요..

 

하나 나뉘어야 할것같은것은.. tag 코드와 id 코드인데.. 이건 데이터 관련이고 바텀내비게이션에서

다른 메뉴로 이동할때마다 값이 바뀌기 때문에 이 두개는 뷰모델로 보내서 라이브데이터로

하는게 어떤가 싶은데 어떤가요..?

 

어떻게 더 나누면 좋을까요?

 

 

codeslave (2,350 포인트) 님이 6월 4일 질문
Navigation 은 별도의 모듈로 빠지는 게 좋구요. Navigation 관련 코드를 정확히는 이해하기 어려운데, 단순히 show, hide하시면 라이프 사이클이 적용되지 않을 것 같은데요. 그리고
ft.setReorderingAllowed(true)
ft.commitNow()
를 하는 이유도 좀 궁금하네요.
음..show hide를 쓰면 데이터가 그대로 유지 될 수 있다고해서, 바텀네비게이션에서 제 앱에서 메뉴를 왔다갔다 할경우가 있으므로 적합하지 않을까해서 사용했습니다..

그리고 라이프 사이클이 적용도지 않을것같다는 말씀응ㄴ 무슨 뜻인가요?

아래 두 함수는 .. 샘플코드 보고한거라 딱히 큰이유는 없습니다 ㅠ

++) commitNow()는 조금 찾아보니까 기존 commit과의 차이가 transaction의 동기 비동기 방식의 차이인것같습니다..제가 아직 쓸일이 있는지는 모르겠네요..
show/hide를 할 경우 onViewCreate, onStart, onResume 등이 호출되지 않습니다. 만약 님이 어떤 로직을 이 콜백에 존재하고, 다른 프레그먼트 등에서 돌와왔을 때 호출되어야 한다면, 이 부분은 수동으로 처리해주셔하 합니다. 그래서 Multi stack이라고 하는 기능을 구현하는게 일반적인 것 같구요. 최근에 Jetpack Navigation도 커뮤니티의 요청사항이 많아서 라이브러리에 이 부분을 추가 중에 있습니다.

1개의 답변

0 추천
setOnNavigationItemSelectedListener의 내용은 여기에 있어야 하니 bottomNav 클릭을 vm에서 하게 하는 것 정도 말고는 없어 보입니다.
쎄미 (162,390 포인트) 님이 6월 4일 답변
그런데 xml의 bottomNav에서 onClick 속성을 설정하면 setOnNavigationItem~ 이게 적용되는건가요?
...