如何在 addView 一些 textview 后使 Android linearlayout 刷新?
How can I make Android linearlayout refresh after addView some textview?
我的资源 xml 有一个线性布局和一个按钮
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginStart="32dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="32dp"
android:gravity="center_horizontal"
android:orientation="horizontal"
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView" />
</LinearLayout>
<Button
android:id="@+id/btn_add_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="84dp"
android:text="Button" />
点击按钮
一些 char 数组被一个一个地添加到 linearLayout
val chars = "Hello".toCharArray()
btn_add_text.setOnClickListener {
linearLayout.removeAllViews()
chars.forEachIndexed { index, char ->
val tv = Textview(this)
tv.textSize = 36f
tv.text = char
tv.id = index
linearLayout.addView(tv)
linearLayout.invalidate()
}
forEachIndexed循环结束linearLayout刷新后可以看到[H][e][l][l][o]五个textviews。
但我想在每次 linearLayout.addView(tv).
后刷新 linearLayout
我认为 linearlayout 的刷新速度如此之快,您看不到中间刷新,您可以做的是,使用工作线程并使其在每次迭代之间休眠 500 毫秒,以及 post 数据通过处理程序到主线程,您的每个字符更改都将可见。
据我所知,如果你想重绘一个视图,你调用 invalidate,如果你想更新视图边界,你也需要调用 requestLayout。
如果你想一步一步看,你可以试试这个:
val handler = Handler()
btn_add_text.setOnClickListener {
linearLayout.removeAllViews()
chars.forEachIndexed { index, char ->
val tv = TextView(context!!)
tv.textSize = 24f
tv.text = char.toString()
tv.id = index
handler.postDelayed(Runnable {
linearLayout.addView(tv)
},500 * index.toLong())
}
}
我的资源 xml 有一个线性布局和一个按钮
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginStart="32dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="32dp"
android:gravity="center_horizontal"
android:orientation="horizontal"
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView" />
</LinearLayout>
<Button
android:id="@+id/btn_add_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="84dp"
android:text="Button" />
点击按钮 一些 char 数组被一个一个地添加到 linearLayout
val chars = "Hello".toCharArray()
btn_add_text.setOnClickListener {
linearLayout.removeAllViews()
chars.forEachIndexed { index, char ->
val tv = Textview(this)
tv.textSize = 36f
tv.text = char
tv.id = index
linearLayout.addView(tv)
linearLayout.invalidate()
}
forEachIndexed循环结束linearLayout刷新后可以看到[H][e][l][l][o]五个textviews。 但我想在每次 linearLayout.addView(tv).
后刷新 linearLayout我认为 linearlayout 的刷新速度如此之快,您看不到中间刷新,您可以做的是,使用工作线程并使其在每次迭代之间休眠 500 毫秒,以及 post 数据通过处理程序到主线程,您的每个字符更改都将可见。
据我所知,如果你想重绘一个视图,你调用 invalidate,如果你想更新视图边界,你也需要调用 requestLayout。
如果你想一步一步看,你可以试试这个:
val handler = Handler()
btn_add_text.setOnClickListener {
linearLayout.removeAllViews()
chars.forEachIndexed { index, char ->
val tv = TextView(context!!)
tv.textSize = 24f
tv.text = char.toString()
tv.id = index
handler.postDelayed(Runnable {
linearLayout.addView(tv)
},500 * index.toLong())
}
}