라떼는말이야

[Android] Toast 하나만 띄우기 (Toast 취소하기) 본문

안드로이드

[Android] Toast 하나만 띄우기 (Toast 취소하기)

MangBaam 2022. 1. 15. 23:38
반응형

Toast가 중복으로 호출되는 경우

토스트는 사용자에게 간단한 알림을 줄 수 있는 기능이다.

하지만 토스트가 중복으로 만들어지는 경우 위 사진처럼 계속해서 토스트가 나와 사용자가 즉각적인 피드백을 받지 못하거나 사용성이 아주 나빠질 수 있다.

Toast 만들기

Toast.makeText(context, "토스트 메시지", Toast.LENGTH_SHORT).show()

보통 위와 같이 토스트를 띄울 것이다.

토스트의 생성과 show를 한 번에 하는 코드이다.

하지만 Toast는 객체화할 수 있고, 객체화된 Toast를 취소할 수도 있다.

 

Toast 취소하기

val toast = Toast.makeText(applicationContext, "토스트 메시지", Toast.LENGTH_SHORT)
toast.show() // 토스트 표시

toast.cancel() // 토스트 취소

 

메소드화 하기

화면(액티비티) 전체에서 토스트가 생성될 때마다 이전 토스트를 취소하려면 같은 기능을 여러 번 구현해야 하기 때문에 코드의 중복이 생기기 마련이다.

그래서 메서드로 만들기로 했다.

class MainActivity: AppCompatActivity() {
	private var toast: Toast? = null
    ...
}

toast는 새로 생성되는 토스트를 매번 할당하기 때문에 var로 선언했고, 화면 전체에서 사용할 것이기 때문에 전역 변수로 선언했다.

초기값은 null로 하였다. (타입을 Toast?로 하지 않고 Toast로 해서 의미 없는 토스트로 초기화해도 되겠다)

 

class MainActivity: AppCompatActivity() {
	private var toast: Toast? = null
    ...
    
    private fun makeToast(message: String) {
    	toast?.cancel()
        toast = Toast.makeText(applicationContext, message, Toast.LENGTH_SHORT)
        toast.show()
    }
}

toast를 cancel 한 후 재 할당해서 show를 하면 이전의 토스트를 취소하고 새로 생성한 토스트를 사용자에게 바로 보여줄 수 있겠다

 

결과

입력할 수 있는 문자와 입력할 수 없는 문자를 번갈아 입력했을 때 거의 즉각적으로 사용자에게 알려줄 수 있다.


추가로 토스트는 화면을 벗어났을 때도 여전히 화면에 보여진다.

class MainActivity: AppCompatActivity() {
	private var toast: Toast? = null
    ...
    
    private fun makeToast(message: String) {
    	toast?.cancel()
        toast = Toast.makeText(applicationContext, message, Toast.LENGTH_SHORT)
        toast.show()
    }
    
    override fun onStop() {
    	super.onstop()
        toast?.cancel()
    }
}

onStop 콜백 메서드에서 toast.cancel()을 해주면 사용자가 상호작용 할 수 없는 시점에서 토스트는 사라지게 된다.

(화면의 일부만 가렸을 때도 사라지게 하고 싶다면 onPause() 콜백 메소드에 넣으면 된다)

반응형
Comments