Android의 Toast는 기본적으로 Toast.LENGTH_SHORT(약 2초) 또는 Toast.LENGTH_LONG(약 3.5초) 두 가지 지속 시간만 제공합니다. 시스템이 임의의 지속 시간 설정을 직접 허용하지 않기 때문에, 더 오래 메시지를 표시하려면 약간의 트릭이 필요합니다. 이번 예제에서는 Kotlin과 CountDownTimer를 활용해 Toast를 원하는 시간(예: 10초) 동안 계속 표시하는 방법을 알아보겠습니다.
핵심 원리
Toast 객체를 한 번 생성한 뒤, CountDownTimer가 주기적으로 show()를 다시 호출하여 Toast가 화면에서 사라지지 않도록 유지하는 방식입니다. 타이머가 종료되면 cancel()을 호출해 Toast를 완전히 닫습니다.
1단계 — 새 프로젝트 생성
Android Studio에서 File → New Project를 선택하고, 빈 Activity 템플릿으로 새 프로젝트를 생성한 뒤 필요한 정보를 모두 입력합니다.
2단계 — 레이아웃 작성 (res/layout/activity_main.xml)
버튼 하나와 텍스트뷰로 구성된 간단한 레이아웃입니다. 버튼을 클릭하면 Toast가 표시됩니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="Tutorials Point"
android:textAlignment="center"
android:textColor="@android:color/holo_green_dark"
android:textSize="32sp"
android:textStyle="bold" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Display Toast"
android:onClick="showToast"
android:textColor="@android:color/background_dark" />
</RelativeLayout>3단계 — MainActivity.kt 구현
아래 코드에서 핵심은 CountDownTimer입니다. 총 지속 시간을 밀리초 단위로 지정하고, 틱(tick) 간격마다 mToastToShow.show()를 호출하여 Toast를 갱신합니다.
import android.os.Bundle
import android.os.CountDownTimer
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var mToastToShow: Toast
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
}
fun showToast(view: View) {
// 원하는 Toast 표시 시간 (밀리초) — 여기서는 10초
val toastDurationInMilliSeconds = 10000
mToastToShow = Toast.makeText(this, "Hello world, I am a toast.", Toast.LENGTH_LONG)
val toastCountDown: CountDownTimer
toastCountDown = object : CountDownTimer(
toastDurationInMilliSeconds.toLong(),
5000 /* 틱 간격 */
) {
override fun onTick(millisUntilFinished: Long) {
// 틱마다 Toast를 다시 표시하여 유지
mToastToShow.show()
}
override fun onFinish() {
// 타이머 종료 시 Toast 취소
mToastToShow.cancel()
}
}
mToastToShow.show()
toastCountDown.start()
}
}4단계 — AndroidManifest.xml 확인
매니페스트 파일에는 별도의 권한 추가 없이 일반적인 Activity 등록만 있으면 됩니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.q1">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>실행 및 결과 확인
실제 Android 기기를 컴퓨터에 연결한 상태에서 Android Studio 툴바의 Run 버튼을 클릭하고, 대상 기기로 연결된 모바일 기기를 선택합니다. 앱이 실행되면 화면 중앙의 Display Toast 버튼을 눌러보세요. 일반적인 LENGTH_LONG보다 훨씬 긴 10초 동안 Toast 메시지가 화면에 유지되는 것을 확인할 수 있습니다.
참고로 틱 간격을 5000ms로 설정한 이유는 LENGTH_LONG의 실제 지속 시간(약 3.5초)이 지난 후 Toast가 사라지기 전에 다시 호출하기 위함입니다. 간격을 너무 길게 하면 Toast가 잠깐 사라졌다 나타나는 현상이 발생할 수 있으므로, 원하는 지속 시간에 맞춰 적절히 조절하시기 바랍니다.