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

(안드로이드/코틀린)뷰페이저2 프레그먼트 내부 버튼으로 프레그먼트끼리 화면 전환 가능한가요?

0 추천

현재 뷰페이저2 와 탭레이아웃을 사용하였고 뷰페이저2 안에 프레그먼트 4개(A,B,C,D) 구성 되어있습니다.

뷰페이저 스와이프 기능은 끈상태이고요. 

(프레그먼트 B 에서 맵 API 사용하기떄문에 스와이프로 화면전환이 되어 막았습니다)

 

처음 화면 로딩되면 프레그먼트 A 가 나오는데 A 화면 안에 버튼을 사용해서 프레그먼트 B나 C로 전환이

가능한지 여쭤봅니다..

 

아래의 코드가 전환 요청한 코드이며, childFragmentManager 랑 supportFragmentManager 다사용해봤습니다. 

transaction 쪽에서도 replace 와 add 모두 해봤지만 오류가 뜹니다..

프레그먼트 B, C 둘다 FRAMELAYOUT 이 아닌 CONSTAINTLAYOUT 사용중이긴 합니다

val transaction = childFragmentManager.beginTransaction()
                transaction.replace(R.id.mapFragment_mainlayout,mapFragment)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                transaction.commit()

아래는 에러 코드입니다.

java.lang.IllegalArgumentException: 
No view found for id 0x7f09010d 
(org.xxx.xxx:id/mapFragment_mainlayout) 
for fragment MapFragment{ea22398} 
(be88f3da-d2fc-4335-a10f-459e67154a22 id=0x7f09010d)

 

Sky_chobo (150 포인트) 님이 2021년 10월 4일 질문

1개의 답변

0 추천

원하시는 대로 되려면 ViewPager 안에 있는 프레그먼트 들과 ViewPager 또는 TabLayout 사이에 통신이 이루어져야 할  것 같은데요. 당장 생각나는 방법은 ViewPager가 있는 액티비티 사이에 인터페이스를 통해서 메세지를 주고 받는겁니다.  

아래처럼 뷰페이지를 제어할 수 있는 인터페이스를 선언합니다.

interface ViewPageable {
    fun setPageTo(position: Int)
}

 

액티비티가 ViewPagable를 구현하도록 합니다.

class MainActivity : AppCompatActivity(), ViewPageable {
  
   ...

    override fun setPageTo(position: Int) {
        binding.viewPager.setCurrentItem(position, false)
    }
}

 

뷰페이저 안에 있는 프레그먼트 들에 다음과 같이 처리합니다.

class MapFragment : Fragment() {

   ...

    private var viewPageable: ViewPageable? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        viewPagable = context as? ViewPageable
    }

   private fun buttonClick() {
      val pageToGo = 1
       viewPageable?.setPageTo(pageToGo)
   }
}

 

그리고 개인적으로 드는 생각은 뷰페이져 필요없이 탭레이아웃만 사용해도 된다면, 뷰페이저를 제거하고 탭만 추가한 다음, 탭을 클릭할 때 프레그먼트를 교체하는 방법도 고려해볼 수 있을 것 같습니다. 

spark (227,470 포인트) 님이 2021년 10월 4일 답변
...