Android

[안드로이드/메시징] SnackBar

gangmini 2023. 4. 4. 16:18
반응형

SnackBar

  • Toast의 업그레이드 버전 정도 되는 메시징 도구
  • Activity 위에 표시되며 하단에 표시
  • 안드 11 부터 기본 toast 는 사용가능 하지만 커스터마이징 하는 것은 snackbar 이용 권장
// 기본 스낵바 설정
binding.button.setOnClickListener {

    //스낵바는 os에 기본 내장되어 있지 않고 구글에서 제공하고 잇는 추가 라이브러리를 세팅해 사용
    val snack1 = Snackbar.make(it,"기본 스낵바", Snackbar.LENGTH_LONG )  // Snackbar.LENGHT_INDEFINITE
    //첫번째 파라미터 : 스낵바를 나타나게 하기 위해 사용할 뷰 (이 예제에서는 버튼)
    snack1.setTextColor(Color.RED)
    snack1.setBackgroundTint(Color.BLUE)
    snack1.animationMode = Snackbar.ANIMATION_MODE_FADE//스낵바가 아래에서 위로 올라오는 것과 같은 애니메이션 모드 변경

    // snackbar에 옵션을 줘서 Actoin을 줌 (하나만 설정 가능)
    // 클릭 리스너를 람다로 구현 가능
    snack1.setAction("Action") {
        binding.textView.text = "Action Click"
    }

    //callback
    val callback = object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
        override fun onShown(transientBottomBar: Snackbar?) {
            super.onShown(transientBottomBar)
            binding.textView2.text = "스냅바 나타남"
        }

        override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
            super.onDismissed(transientBottomBar, event)
            binding.textView2.text = "스냅바 사라짐"
        }
    }
    snack1.addCallback(callback)

    snack1.show()
}

 

스낵바 커스텀

  • 새로운 view를 설정하는 메서드나 프로퍼티 없음 -> 스낵바 구성에 필요한 원래 layout(스낵바에 원래 존재)을 추출해 거기에 view를 추가
// 커스텀 스낵바
binding.button2.setOnClickListener {
    //스낵바 만들기
    val snack2 = Snackbar.make(it,"커스텀 스낵바", Snackbar.LENGTH_LONG )

    var snack_binding: CustomSnackBinding = CustomSnackBinding.inflate(layoutInflater)
    //이미지, 텍스트 바꿔주기
    snack_binding.snackImg.setImageResource(R.drawable.custom_img)
    snack_binding.snackText.text = "새로 추가된 뷰"
    snack_binding.snackText.setTextColor(Color.WHITE)

    //커스텀할 뷰 만들기
    val snackView = snack_binding.root

    //스낵바 객체에 내재된 레이아웃 추출
    val snackbarLayout = snack2.view as Snackbar.SnackbarLayout
    snackbarLayout.addView(snackView) //뷰 추가하기

    //스낵바에 있는 텍스트뷰를 추출해 이를 보이지 않게 처리
    //스낵바 객체에서 추출한 레이아웃에서 findViewById로 텍스트뷰 객체를 추출
    val snackText = snackbarLayout.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)
    snackText.visibility = View.INVISIBLE

    snack2.show()

}

 

반응형