Как я могу сделать Android linearlayout refre sh после добавления просмотра текста? - PullRequest
0 голосов
/ 15 апреля 2020

My res 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" />

нажмите кнопку, чтобы массив символов, добавленный к 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 l oop закончила обновление linearLayout и может видеть [H] [e] [l] [l] [o] пять текстовых просмотров. Но я хочу сделать linearLayout refre sh после каждого linearLayout.addView (tv).

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

Насколько я знаю, если вы хотите, чтобы представление перерисовывалось, вы вызываете invalidate, и если вы хотите обновить границы представления, вам также необходимо вызвать requestLayout.

1 голос
/ 15 апреля 2020

Если вы хотите увидеть шаг за шагом, вы можете попробовать это:

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())
    }
}
1 голос
/ 15 апреля 2020

Я думаю, что linearlayout обновляется так быстро, что вы не можете видеть промежуточные обновления, то, что вы можете сделать, это использовать рабочий поток и переводить его в спящий режим на 500 мс между каждой итерацией и отправлять данные в основной поток через обработчик, каждая ваша смена символа будет видна.

...