SubwayTooter-Android-App/app/src/main/java/jp/juggler/util/ToastUtils.kt

59 lines
2.2 KiB
Kotlin
Raw Normal View History

2018-12-01 00:02:18 +01:00
package jp.juggler.util
import android.content.Context
import android.widget.Toast
import me.drakeet.support.toast.ToastCompat
import java.lang.ref.WeakReference
2018-12-01 00:02:18 +01:00
object ToastUtils {
private val log = LogCategory("ToastUtils")
private var refToast: WeakReference<Toast>? = null
2021-06-27 12:05:04 +02:00
internal fun showToastImpl(context: Context, bLong: Boolean, message: String): Boolean {
runOnMainLooper {
// 前回のトーストの表示を終了する
try {
refToast?.get()?.cancel()
} catch (ex: Throwable) {
log.trace(ex)
} finally {
refToast = null
}
// 新しいトーストを作る
try {
val duration = if (bLong) Toast.LENGTH_LONG else Toast.LENGTH_SHORT
val t = ToastCompat.makeText(context, message, duration)
t.setBadTokenListener { }
t.show()
refToast = WeakReference(t)
} catch (ex: Throwable) {
log.trace(ex)
}
// コールスタックの外側でエラーになる…
// android.view.WindowManager$BadTokenException:
// at android.view.ViewRootImpl.setView (ViewRootImpl.java:679)
// at android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:342)
// at android.view.WindowManagerImpl.addView (WindowManagerImpl.java:94)
// at android.widget.Toast$TN.handleShow (Toast.java:435)
// at android.widget.Toast$TN$2.handleMessage (Toast.java:345)
}
2021-06-27 12:05:04 +02:00
return false
}
2018-12-01 00:02:18 +01:00
}
2021-06-27 12:05:04 +02:00
fun Context.showToast(bLong: Boolean, caption: String?): Boolean =
2021-06-20 15:46:07 +02:00
ToastUtils.showToastImpl(this, bLong, caption ?: "(null)")
2018-12-01 00:02:18 +01:00
fun Context.showToast(ex: Throwable, caption: String="error."): Boolean =
2021-06-20 15:46:07 +02:00
ToastUtils.showToastImpl(this, true, ex.withCaption(caption))
2018-12-01 00:02:18 +01:00
2021-06-27 12:05:04 +02:00
fun Context.showToast(bLong: Boolean, stringId: Int, vararg args: Any): Boolean =
ToastUtils.showToastImpl(this, bLong, getString(stringId, *args))
2018-12-01 00:02:18 +01:00
2021-06-27 12:05:04 +02:00
fun Context.showToast(ex: Throwable, stringId: Int, vararg args: Any): Boolean =
ToastUtils.showToastImpl(this, true, ex.withCaption(resources, stringId, *args))