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

하나의 액티비티에 여러개의 레이아웃을 적용할때 더 좋은 방법은 무엇일까요?

0 추천
예를 들어 개발하는 앱이 다양한 국가에서 출시하는 앱으로 회원가입 화면에서 국가마다의 입력 폼 양식이 약간씩만 상이한 상태라면 이 때 화면 구성을 어떤식으로 하는 것이 효율적이고 추 후 유지보수시 좋을까요?

 

1. 하나의 액티비티에 여러 개의 프래그먼트를 사용하는 방법

2. 하나의 액티비티에 여러 개의 뷰를 사용하는 방법 ( 레이아웃도 1개를 사용하여 visibility를 사용)

3. 하나의 액티비티에 레이아웃 파일을 동적으로 변경하는 방법

 

우선 생각이 나는 방식은 위 3가지 정도가 떠오르는데 위 3가지 방법중에서 아니면 혹 더 나은 방법이 있다면 알려주시면 감사하겠습니다.
자발개보초 (340 포인트) 님이 2023년 4월 7일 질문

1개의 답변

0 추천
 
채택된 답변

Jetpack Compose가 딱 좋은 방법이긴 한데, 이건 사용하지 않으시는 것 같고, View를 이용하는 방법 중에서는
지원하는 국가가 2-3개 정도 까지라면 1, 2, 3번 방법이 크게 차이는 없을 것으로 보이나, 지원 국가가 늘어날 수록 2번 보다는 1번 방법이 코드르를 국가에 따라 명료하게 분리할 수도 있고. 레이아웃이 차이가 좀 생기는 경우에도 대처하기 쉬울 것 같고, 추후에 특정 국가와 관련된 부분을 수정할 때, 다른 국가의 코드나 레이아웃은 건드리지 않아서 안전할 것으로 보입니다. 물론 프레그먼트를 사용하지 않고 국가별로 레이아웃만 별도로 준비해서 이걸  rootView에 추가하는 방법도 사용할 수 있겠지만, 안드로이드에서 이미 프래그먼트를 지원하고 있으니, 이걸 사용하면 될 것 같습니다.

선택한 국가에 따른 프레그먼트를 맵핑할 때, 아래처럼  enum 클래스를 하나 사용하면 도움이 됩니다. (코드는 코를린입니다.)

interface FragmentAware {
    fun getFragment(): Fragment
}

enum class Country(val title: String) : FragmentAware {
   CHN("China") {
      override fun getFragment(): Fragment {
           return ChinaSignUpFragment()
      }
    },
   JPN("Japan") {
       override fun getFragment(): Fragment {
           return JapanSignUpFragment()
      }
   },
   KOR("Korea") {
       override fun getFragment(): Fragment {
           return KoreaSignUpFragment()
      }
   }
}

회원가입 화면에서 국가를 선택할 때 enum 클래스에서 선택한 국가를 찾아, 보여주어야 할 프래그먼트를 가져올 수 있습니다.

fun selectCountry(val countryName: String) {
      val selectedCountry = Country.values().find { country ->
           country.title.equals(countryName, ignoreCase = false)
      }!!

     supportFragmentManager()
        .beginTransaction()
        .replace(R.id.container, selectedCountry.getFragment())
        .commit()
}

 

혹시 두번째 방법을 사용한다면, 마찬가지로 enum 클래스를 이용하여 보여주거나 감추어야 할 뷰를 지정하여 사용하실 수 있습니다.

enum class Country(val title: String, val nationalIDVisibie: Boolean) {
   CHN("China", false) ,
   JPN("Japan", false),
   KOR("Korea", true)
}


fun selectCountry(val countryName: String) {
      val selectedCountry = Country.values().find { country ->
           country.title.equals(countryName, ignoreCase = false)
      }!!

    binding.nationalIDView.isVisible = selectedCountry.nationalIDVisibie
  
}

 

spark (224,800 포인트) 님이 2023년 4월 7일 답변
자발개보초님이 2023년 4월 7일 채택됨
...