바텀시트 dialog로 만들기

quinones·2024년 6월 26일

전에는 바텀시트를 사용하는 액티비티 안에서 레이아웃을 만들고, 이 레이아웃을 coordinatorLayout으로 감싸고, 레이아웃에

app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"

이런 설정을 추가해서 만들었었다.

하지만 이는 의존성이 너무 높아져서 재사용이 불가능하다는 단점이 있다.

그래서 Dialog형식의 바텀시트를 만들어보려고 한다.

원하는 형식의 프래그먼트 생성

BottomSheetFragment

class BottomSheetFragment(val mContext : Context) : BottomSheetDialogFragment() {

    private var _binding: FragmentGameStatusBottomSheetDialogBinding? = null
    private val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentGameStatusBottomSheetDialogBinding.inflate(inflater, container, false)
        return binding.root
    }

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

주의할건 없고, 프래그먼트를 상속받는것이 아닌 BottomSheetDialogFragment()를 상속받아야 한다.

fragment_bottom_sheet.xml

여기는 뭐 없다. 그냥 바텀시트에 넣고싶은 형식으로 위젯들을 넣어주면 된다.

Fragment에서 해당 Dialog호출

먼저 전역변수로 Context를 호출해준다.

private lateinit var mContext: Context

그 후에 호출해주면 되는데 아래에서는 btnTest 버튼 클릭시 해당 바텀시트를 호출해줬다.

binding.btnTest.setOnClickListener {
    mContext = this.requireContext()
    val gateStatusBottomSheet = GameStatusBottomSheetDialogFragment(mContext)
    gateStatusBottomSheet.show(requireActivity().supportFragmentManager, gateStatusBottomSheet.tag)
}

requireActivity().supportFragmentManager 대신 childFragmentManager도 가능하다.


바텀시트
bottomsheet
bottom_sheet

profile
이우진

0개의 댓글