为什么在Android 12 API 31上安装应用程序时,祝酒词会被截断

zzzyeukh  于 2023-04-10  发布在  Android
关注(0)|答案(2)|浏览(88)

文档说,Toasts在应用程序 * 目标 * Android 12或更高版本上被截断为两行。我观察到的行为是,Toasts在运行Android 12或更高版本的设备上 * 安装 * 的应用程序上被截断为两行。
具体来说,我的手机更新到Android 12之前安装的一个应用程序不会被截断,但如果我在运行Android 12的模拟器上安装它,它会被截断。另一个我在手机更新到Android 12之后重建并安装的应用程序会被截断。

更新:

实际情况似乎更为复杂:行为也取决于设备,显然也取决于它是调试版本还是发布版本。同一个应用程序的toast被截断,在我的手机上正确显示了发布版本,但在模拟器上截断了 * 相同 * 的发布版本。
请注意,这与70307699的问题不同,OP将他的targetSdk更新为31。我的两个应用程序都将targetSdk设置为小于31。
我如何才能获得记录的行为并取回我的祝酒词?

lf5gs5x2

lf5gs5x21#

Android平台团队并没有彻底弃用toasts,而是逐渐降低它们的有用性,这是弃用的一种形式。
https://developer.android.com/reference/android/widget/Toast
最后一句说:Starting with Android 12 (API level 31), apps targeting Android 12 or newer will have their toasts limited to two lines.
如果我需要多行消息,我个人会使用Snackbars。

val SNACKBAR_MAX_LINES = 8 // Increase maximum SnackBar line limit above 2
val snackbar = Snackbar.make(bottomNavigationView, "message", Snackbar.LENGTH_SHORT)
            (snackbar.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView)
                .run {
                    maxLines = SNACKBAR_MAX_LINES 
                }

snackbar.show()
hgtggwj0

hgtggwj02#

也许这可以是一个变通的办法。尝试创建一个自定义的吐司消息。我尝试用PopupWindow创建一个。这个类的setContentView方法可以用来设置自定义布局,从而可以支持多行文本。
Android上的自定义吐司:简单的例子
如果你想通过在应用程序的Application类中创建一个方法来使它成为一个通用的方法。下面是代码。

class ApplicationClass() : Application(), Application.ActivityLifecycleCallbacks {
    private var activityReference: Activity? = null

    override fun onCreate() {
        super.onCreate()
        registerActivityLifecycleCallbacks(this)
    }

    fun showCustomToast(toast: String) {
        try {
            activityReference?.window?.decorView?.let {
                val popupWindow = PopupWindow(it.width - 200, ViewGroup.LayoutParams.WRAP_CONTENT)
                val binding = GenericToastPopupBinding.inflate(LayoutInflater.from(this))
                binding.toastMessage.text = toast
                popupWindow.contentView = binding.root
                binding.close.setOnClickListener {
                    popupWindow.dismiss()
                }
                popupWindow.setBackgroundDrawable(
                    ContextCompat.getDrawable(
                        this,
                        R.drawable.bg_rectangle_white
                    )
                )
                popupWindow.animationStyle = android.R.style.Animation_Toast
                popupWindow.showAtLocation(it, Gravity.BOTTOM, 0, 500)
                MainScope().launch {
                    delay(5000)
                    popupWindow.dismiss()
                }
            }

        } catch (e: Exception) {
            Log.d("TAG", "showCustomToast: ")
        }
    }

    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
        activityReference = activity
    }

    override fun onActivityStarted(activity: Activity) {
        activityReference = activity
    }

    override fun onActivityResumed(activity: Activity) {
        activityReference = activity
    }

    override fun onActivityPaused(activity: Activity) {
       
    }

    override fun onActivityStopped(activity: Activity) {
       
    }

    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
     
    }

    override fun onActivityDestroyed(activity: Activity) {
      
    }
}

相关问题