不能 Unhide/Hide 进度条 Android

Cannot Unhide/Hide ProgressBar Android

我有一个 activity,它由一个 ImageView、一个 Button 和一个 ProgressBar 组成。

activity 的 XML 如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/submitActivityConstraintLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SubmitActivity">

    <ImageView
        android:id="@+id/previewImageView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toTopOf="@+id/submitButton"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/submitButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:text="Submit"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:elevation="2dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

并且按钮有如下按钮点击监听函数:

val progressBar=findViewById<ProgressBar>(R.id.progressBar)
val submitActivityConstraintLayout=findViewById<ConstraintLayout>(R.id.submitActivityConstraintLayout)
progressBar.visibility=View.VISIBLE
submitActivityConstraintLayout.background = ColorDrawable(ContextCompat.getColor(this, R.color.shadow))
runBlocking{delay(5000L)}
progressBar.visibility=View.GONE
submitActivityConstraintLayout.background = ColorDrawable(ContextCompat.getColor(this, R.color.white))

我想要实现的是在 ImageView 上显示 ProgressBar 并在单击按钮后立即更改 ConstraintLayout 的背景颜色,然后再次 return 返回到响应为 return来自异步任务。

但由于某些原因我无法同时实现它们。

问题是您占用了主线程,因此您的更改在更改回来之前没有机会呈现。您可以将延迟移出 UI 线程,并允许更改在 UI 线程上呈现和显示。当延迟线程完成时,它将根据需要在主线程上进行 UI 更改。

像这样的东西应该可以工作:

Log.d("Applog", "Before")
launch {
    delay(5000L)
    launch(Dispatchers.Main) {
        Log.d("Applog", "After")
        progressBar.visibility = View.GONE
        submitActivityConstraintLayout.background =
            ColorDrawable(ContextCompat.getColor(this@MainActivity, R.color.white))
    }
}
Log.d("Applog", "Continuing...")

您应该会在“继续...”之后看到“之前”,然后会延迟五秒钟,在此期间您会​​看到所做的更改。延迟后,您将看到您的第二组更改和“之后。”