Programming/Android

[Android] Toast 나타나는 위치 변경 / setGravity() / API30 이상

코딩뽀시래기 2024. 5. 9. 00:09
728x90

Android 개발을 할 때 Toast 위치는 보통 하단 가운데에 나타나게 된다. 이를 setGravity() 메서드를 이용해서 위치를 변경하는 방법이 있다는 사실을 알게 되었는데, 관련해서 정리해보려고 한다!

 

API 29 이하일 때와 30 이상일 때 적용 가능한 방법을 각각 기록해두었다.

 

💡 Toast setGravity() - API 29 이하

// Kotlin 코드
Toast.setGravity(int gravity, int xOffset, int yOffset)

 

위와 같은 방식으로 위치를 지정할 수 있다. gravity는 화면의 상단, 중앙, 하단 등을 지정하고, xOffset, yOffset으로 떨어진 거리를 나타내준다.

 

// Kotlin 코드
binding.buttonToast.setOnClickListener {
    var tMsg = Toast.makeText(applicationContext, "토스트 연습", Toast.LENGTH_SHORT)

    var display = (getSystemService(Context.WINDOW_SERVICE) as
            WindowManager).defaultDisplay
    var xOffset = (Math.random() * display.width).toInt()
    var yOffset = (Math.random() * display.height).toInt()

    tMsg.setGravity(Gravity.TOP or Gravity.START, xOffset, yOffset)
    tMsg.show()
}

 

위처럼 코드를 작성하면 버튼을 눌렀을 때 아래 이미지처럼 랜덤한 위치에 Toast가 나타나게 된다.

 

 

 

⚠️ issue 발생 - API 30부터는 동작하지 않음

그런데 처음에는 예제 코드대로 작성을 했는데도 Toast가 나타나는 위치가 바뀌지 않고, 그대로 하단 중앙에 표시되었다. 그래서 문제를 해결하기 위해 서치를 해봤더니... API 30 버전부터는 단순 텍스트는 setGravity가 적용되지 않고, 커스텀 뷰에서만 가능하다는 내용을 발견했다. API 29(Android 10) 이하 버전에서는 정상 작동한다.

 

 

안드로이드스튜디오 토스트메세지 안뜨는 이유가 뭔지 좀 확인 부탁드립니다 ㅠㅠ

안녕하세요,코린인데 안드로이드스튜디오 독학 중입니다.아래와 같이 토스트메세지에 그래비티를 설정했는데 버튼만 뜨고 메세지가 뜨질 않아요ㅠㅠAMD를 nexus 5 뭐시기에서 pixel 뭐시기로 바꾸

qna.programmers.co.kr

위 질문의 답변에서 커스텀 뷰를 이용하면 setGravity가 동작한다고 하는데... Java 코드는 있지만 Kotlin으로는 어떻게 해야할지 모르겠다.

 

그래서 일단 API 29 버전(안드로이드 10)의 가상 디바이스를 애뮬레이터로 실행해서 테스트 해보니 해당 버전에서는 제대로 동작하는 것을 확인할 수 있었다. 위에 첨부했던 이미지도 낮은 버전으로 실행했던 것이다.

 

버전을 높이면서 해당 기능을 없앤 데에는 이유가 있지 않을까? Toast 위치를 변경해서 보여줄 일이 있을까? 하는 생각이 들었지만... 그래도 커스텀뷰를 적용해서 높은 버전에서도 동작하는 걸 확인해보고 싶어졌다.

 

🔥 API 30 이상에서도 작동하는 setGravity()

 

[Android, Custom Toast] 커스텀 토스트 만들기

안녕하세요. 블랙진입니다. 지난 포스팅에 이에 토스트를 커스텀 마이징 하는 법을 확인해보겠습니다. Custom Dialog Fragment 만들기 Custom Toast 만들기 (현재)Custom SnackBar 만들기 토스트 화면 최상단에

black-jin0427.tistory.com

 

위 글의 도움을 받아서 성공...! 다만 위에서는 DataBinding을 이용했는데, 아직 DataBinding을 잘 쓰지 못하는 상태라 나는 ViewBinding으로 구현을 했다.

 

// Kotlin 코드
binding.buttonToast.setOnClickListener {
    val inflater = LayoutInflater.from(this)
    val toastBinding = CustomToastBinding.inflate(inflater, null, false)

    toastBinding.toastText.text = "Custom Toast - setGravity"

    Toast(this).apply {
        setGravity(Gravity.BOTTOM or Gravity.CENTER, 200, 500)
        duration = Toast.LENGTH_LONG
        view = toastBinding.root
    }.show()
}

 

<!-- custom_toast.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/custom_toast_container"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="8dp"
    android:background="#DAAA">

    <TextView
        android:id="@+id/toast_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#FFF"
        android:text="TOAST" />

</LinearLayout>

 

 

간단하게 커스텀 Toast를 구현하고 setGravity 적용하는 것까지 성공 🥹

728x90