安卓处理程序自定义吐司的工作方式很奇怪



当我使用带有Handler(Looper.getMainLooper()).post { message }的自定义toast消息在屏幕上显示时,我正在努力解决这个问题。但这并没有达到我的预期。就我而言,我必须使用这个组合
(但我知道如果我不使用任何Handler,它会很好地工作。(
所以,我想做的是显示自定义toast消息,然后立即完成Activity

首先,我将向您展示资源。

custom_last.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_test_toast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ctm_bg_toast"
android:gravity="center"
android:padding="10dp"
android:text="TextView"
android:textColor="#FFFFFF"
android:textSize="14dp" />
</LinearLayout>

ctm_bg_toast.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle">
<solid android:color="#99000000"/>
<corners android:radius="100dp"/>
<padding android:left="10dp" android:top="7dp" android:right="10dp" android:bottom="7dp"/>
</shape>

请仔细查看以下代码片段。

1.使用处理程序

class TestActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Handler(Looper.getMainLooper()).post {
val toast = Toast(this@TestActivity)
toast.view = View.inflate(this@TestActivity, R.layout.custom_toast, null)
((toast.view?.findViewById(R.id.tv_test_toast)) as TextView).text = "test message"
toast.setGravity(Gravity.CENTER, 0, Toast.LENGTH_SHORT)
toast.show()
}
finish()
}
}

此代码不显示自定义toast消息。我觉得原因可能是我刚刚完成了Activity,而Handler正在异步工作。

但是第二个代码片段运行良好。但我不知道它是怎么工作的。

2.使用两层处理程序

class TestActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Handler(Looper.getMainLooper()).post {
Handler(Looper.getMainLooper()).post {
val toast = Toast(this@TestActivity)
toast.view = View.inflate(this@TestActivity, R.layout.custom_toast, null)
((toast.view?.findViewById(R.id.tv_test_toast)) as TextView).text = "test message"
toast.setGravity(Gravity.CENTER, 0, Toast.LENGTH_SHORT)
toast.show()
}
}
finish()
}
}

上面的代码运行得非常好。我刚刚用另一个Handler包裹了Handler。仅此而已
所以,我想知道的是两层Handlers是如何在引擎盖下良好工作的,我现在缺少什么?

这几乎肯定是finish()的问题。但有一个更简单的修复方法——只需在调用toast.show()之后,在处理程序中运行finish()

class TestActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Handler(Looper.getMainLooper()).post {
val toast = Toast(this@TestActivity)
toast.view = View.inflate(this@TestActivity, R.layout.custom_toast, null)
((toast.view?.findViewById(R.id.tv_test_toast)) as TextView).text = "test message"
toast.setGravity(Gravity.CENTER, 0, Toast.LENGTH_SHORT)
toast.show()
finish()
}
}
}

最新更新