Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[37일차 Android] SnackBar 본문

Computer/Android

[37일차 Android] SnackBar

Wise-99 2023. 6. 23. 21:20

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 SnackBar

  • Toast와 비슷하며 Activity 위에 표시되며 하단에 나타나는 메시지이다.

주요 메서드

메서드 설명
make SnackBar를 구성
setTextColor 메시지의 색상 설정
setBackgroundTint 배경 색상 지정
setAnimationMode 나타나고 사라지는 애니메이션 설정
setAction 클릭하면 이벤트를 처리할 수 있는 요소를 설정
show SnackBar를 표시

 

Callback

  • Snackbar가 나타나거나 사라졌을 때 반응한다.
    • onShown()
    • onDismissed()

 

커스터마이징

  • Snackbar는 새로운 View를 설정하는 메서드나 프로퍼티가 없다.
  • Snackbar를 구성하기 위해 사용되는 Layout을 추출해 View를 추가해서 처리한다.

 

 

 

예제 코드

lateinit var snackBar1 : Snackbar

button3.run {
	setOnClickListener {
		// SnackBar 객체를 생성한다.
		// val snackBar1 = Snackbar.make(it, "기본 스낵바", Snackbar.LENGTH_SHORT)
		// val snackBar1 = Snackbar.make(it, "기본 스낵바", Snackbar.LENGTH_LONG)
		snackBar1 = Snackbar.make(it, "기본 스낵바", Snackbar.LENGTH_INDEFINITE)

		// snackBar의 CallBack
		snackBar1.addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>(){

			override fun onShown(transientBottomBar: Snackbar?) {
				super.onShown(transientBottomBar)
				textView.text = "SnackBar가 나타났습니다"
			}

			override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
				super.onDismissed(transientBottomBar, event)
				textView.text = "SnackBar가 사라졌습니다"
			}
		})

		// 메시지 색상
		snackBar1.setTextColor(Color.RED)
		// 배경색
		snackBar1.setBackgroundTint(Color.BLUE)
		// 애니메이션
		// snackBar1.animationMode = Snackbar.ANIMATION_MODE_FADE
		snackBar1.animationMode = Snackbar.ANIMATION_MODE_SLIDE

		// Action 설정
		snackBar1.setAction("Action1"){
			activityMainBinding.textView2.text = "Action1을 눌렀습니다"
		}

		snackBar1.setAction("Action2"){
			activityMainBinding.textView2.text = "Action2를 눌렀습니다."
		}
		snackBar1.show()
	}
}

button4.run{
	setOnClickListener {
		
		if(::snackBar1.isInitialized){
			
			if(snackBar1.isShown == true){
				
				snackBar1.dismiss()
			}
		}
	}
}
  • button3
    • Snackbar.make() : view, text, 보여질 시간에 대해 정의하여 Snackbar 객체를 생성한다.
      • LENGTH_INDEFINITE : 사라지지 않고 계속 보여진다. 코드를 이용해 사라지게 해야 한다.
      • LENGTH_SHORT : 짧은 시간동안 유지된다.
      • LENGTH_LONG : 긴 시간동안 유지된다.
    • addCallback
      • onShown() : SnackBar가 나타날 때 동작하는 메서드
      • onDismissed() : SnackBar가 사라질때 동작하는 메서드
    • Snackbar.ANIMATION_MODE_FADE : 기본 애니메이션
    • Snackbar.ANIMATION_MODE_SLIDE : 아래에서 올라오는 듯한 애니메이션

 

  • button4
    • if(::snackBar1.isInitialized){ ... } : snackBar1이 초기화 되어있는지 확인한다. 초기화 되어있을 때(button3)을 눌렀을 때만 동작한다.
    • if(snackBar1.isShown == true){ ... } : 현재 Snackbar가 보여지고 있는 상태인지 확인한다.
    • snackBar1.dismiss() : Snackbar를 사라지게 한다.

 

 

 

커스텀 SnackBar - snackbar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageViewSnackBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:srcCompat="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/textViewSnackBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />
</LinearLayout>

 

 

 

MainActivity.kt - 커스텀 SnackBar 구현

button5.setOnClickListener {
	// SnackBar를 생성한다
	val snackBar2 = Snackbar.make(it, "Custom SnackBar", Snackbar.LENGTH_SHORT)
	// ViewBinding
	val snackbarBinding = SnackbarBinding.inflate(layoutInflater)

	// View 설정
	snackbarBinding.run {
		imageViewSnackBar.setImageResource(R.drawable.img_android)
		textViewSnackBar.text = "새로 추가된 View"
		textViewSnackBar.setTextColor(Color.WHITE)
	}

	val snackBarLayout = snackBar2.view as Snackbar.SnackbarLayout
	snackBarLayout.addView(snackbarBinding.root)

	val t1 = snackBarLayout.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)
	t1.visibility = View.INVISIBLE

	snackBar2.show()
}
  • SnackBar를 ViewBinding을 통해 커스텀 한다.
    • val snackBarLayout = snackBar2.view as Snackbar.SnackbarLayout
      • 커스텀한 결과를 반영하기 위해 SnackBar의 Layout을 추출하여 새로운 View를 추가한다.
    • t1.visibility = View.INVISIBLE
      • SnackBar가 가지고 있는 TextView를 보이지 않게 한다.

 

 

 

결과

ANIMATION_MODE_FADE와 ANIMATION_MODE_SLIDE 비교

  • SnackBar 없애기 버튼을 눌러야 사라진다.
ANIMATION_MODE_FADE ANIMATION_MODE_SLIDE
ANIMATION_MODE_FADE

ANIMATION_MODE_SLIDE
 
 

 

 

 

커스텀 SnackBar

'Computer > Android' 카테고리의 다른 글

[38일차 Android] Notification  (0) 2023.06.25
[37일차 Android] Dialog  (0) 2023.06.23
[37일차 Android] Toast  (0) 2023.06.23
[37일차 Android] 다른 앱의 Activity 실행하기  (0) 2023.06.23
[34일차 Android] OnActivityResult  (0) 2023.06.23