본문 바로가기

안드로이드

[Android Studio] Custom SnackBar 만들기 ! (코틀린)

728x90

 

오늘은 안드로이드에서 Custom SnackBar 를 만들어 보겠습니다. 

 

SnackBar 로 사용할 xml 파일을 만들어 줍니다. 

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="android.view.View" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="@dimen/size08"
            android:background="@drawable/bg_roundbox_gray08_08_dp"
            android:paddingHorizontal="@dimen/size16"
            android:paddingVertical="@dimen/size15"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:fontFamily="@font/pretendard_std_regular"
                android:gravity="center"
                android:lineSpacingExtra="@dimen/size04"
                android:textColor="@color/grayscale_01"
                android:textSize="@dimen/size14"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                />

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/size16"
                android:fontFamily="@font/pretendard_std_bold"
                android:gravity="center"
                android:lineSpacingExtra="@dimen/size04"
                android:textColor="@color/primary_lighter_03"
                android:textSize="@dimen/size14"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toEndOf="@id/textView"
                app:layout_constraintTop_toTopOf="parent"
                />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

 

 

Class 파일을 하나 생성해줍니다. 

 


//사용할 TextView 가 2개 임으로 파라미터에 2개의 String 을 넣어준다. 한개는 callBack 메소드이다. 
class SnackBar(
    view: View,
    private val message: String,
    private val message2: String, 
    private val callback: () -> Unit
) {
    companion object {
        fun make(view: View, message: String, message2: String, callback: () -> Unit) =
            InAppSnackBar(view, message, message2, callback)
    }

    private val context = view.context
    private val snackbar = Snackbar.make(view, "", 2000) // 시간을 나타낸다.
    private val snackbarLayout = snackbar.view as Snackbar.SnackbarLayout

    private val inflater = LayoutInflater.from(context)
    
    // 만들었던 layout binding 시켜준다. 
    private val snackbarBinding: LayoutInAppSnackBarBinding =
        DataBindingUtil.inflate(inflater, R.layout.layout_in_app_snack_bar, null, false)

    init {
        initView()
        initData()
    }

    private fun initView() {
        with(snackbarLayout) {
            removeAllViews()
            setPadding(0, 0, 0, context.dpToPxSize(120))
            setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent))
            addView(snackbarBinding.root, 0)
        }
    }

    private fun initData() {
    	// 파라미터로 가져왔던 String 을 TextView 에 set 해준다. 
        snackbarBinding.textView.text = message
        snackbarBinding.textView2.text = message2
        
        // 파라미터로 가져왔던 메소드를 넣어준다. 
        snackbarBinding.textView2.setOnClickListener {
            snackbar.dismiss()
            callback()
        }
    }

    fun show() {
        snackbar.show()
    }
}

 

 

사용법. 

private fun showSnackBar() {
    SnackBar(binding.root, SNACK_TITLE, SNACK_BUTTON_TITLE) {
       //TODO.
    }.show()
}

 

 

이상입니다!