当我使用带有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()
}
}
}