我不知道为什么它没有显示ProgressBar
。在布局中,最初是这样设置的:
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/double_margin"
android:layout_marginRight="@dimen/double_margin"
android:indeterminate="true"
android:visibility="gone"
style="@style/AppTheme"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent" />
在代码中,它将 android:visibility 更改true
为按下按钮的时间和false
数据到达之后 - 虽然按下按钮和数据到达之间有很多时间 - 我设置了最多 10 秒的延迟,但它仍然根本ProgressBar
不可见。
class ActorActivity : AppCompatActivity() {
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_actor_details)
val moreBtn = findViewById<Button>(R.id.more_btn)
val progressBar = findViewById<ProgressBar>(R.id.progressbar)
moreBtn.setOnClickListener {
progressBar.isVisible = true
viewModel.getMoreInfo(actor.name)
}
viewModel.actor.observe(this, Observer<Actor> {
progressBar.isVisible = false
})
}
}
ProgressBar
此外,如果您最初没有在布局中设置它
android:visibility="gone"
然后他是可见的。
UPD:ProgressBar
使用-om的完整标记:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/more_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="@dimen/double_margin"
android:layout_marginTop="@dimen/double_margin"
android:text="@string/more_btn_label"
android:textColor="@android:color/white"
android:background="@color/colorPrimary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/avatar" />
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/double_margin"
android:layout_marginRight="@dimen/double_margin"
android:indeterminate="true"
android:visibility="gone"
style="@style/AppTheme"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<ImageView
android:id="@+id/avatar"
android:layout_height="0dp"
android:layout_width="match_parent"
android:contentDescription="@string/avatar"
android:scaleType="centerCrop"
android:layout_marginTop="@dimen/double_margin"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/more_btn"
tools:src="@tools:sample/avatars" />
<TextView
android:id="@+id/details"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/margin"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/avatar"
tools:text="@tools:sample/lorem" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
我终于弄清楚出了什么问题。这仍然是我的错:我打电话给
从主线程,并停止主线程,因此进度条没有时间出现。一旦我把这条线带入背景,进度条就变得可见。
SO上类似问题的答案给了我这个想法。
ConstraintLayout
这是与此布局的功能相关的众所周知的功能/错误,即 cvisibility=gone
。如您所知,如果visibility=gone
布局管理器计算元素的位置,就好像给定元素不存在一样 - 有时很方便,有时不那么方便。没有通用的方法来解决这个问题(至少我不知道)。
人们尽可能地离开——他们通过
android:layout_weight
甚至android:layout_width=0dp
改变RelativeLayout
或visibility=invisible
谷歌一下,试试看。