Добавить несколько TextView для динамического просмотра

Мне нужно добавить неопределенное количество текстовых изображений в представление, и мне бы очень хотелось, чтобы его можно было автоматически настраивать под экран.

Я попытался добавить горизонтальный LinearLayouts к вертикальному родительскому LinearLayout, но таким образом я могу добавить, может быть, 2 элемента или 3 элемента на строку, но это не имеет этого неупорядоченного эффекта.

Есть ли способ добиться этого?

2 ответа

Я предлагаю не создавать динамически горизонтальный макет (если вы это делаете).

вместо этого вы можете создать ресурс горизонтального макета следующим образом:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:weightSum="2">

    <TextView
        android:id="@+id/start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_weight="1"
        android:text="ONE" />

    <TextView
        android:id="@+id/end"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="end"
        android:text="TWO" />
</LinearLayout>

А потом в своей основной деятельности сделайте так:

 for(i in 0..2) {
        val view: View?
        val inflater =
            this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        view = inflater.inflate(R.layout.horizontal, null)

        val textOne = view.findViewById<TextView>(R.id.start)
        textOne.text = "TEST $i"

        val textTwo = view.findViewById<TextView>(R.id.start)
        textTwo.text = "TEST $i"

        (mainL as LinearLayout).addView(view)
    }

Где mainL - это основной вертикальный макет, к которому вы можете добавить отступы или изменить горизонтальный, это зависит от того, чего вы хотите достичь.

В этом примере я использовал цикл for, чтобы показать вам, что создаются 3 строки, в каждом цикле, если у вас есть список текста для ввода, вы можете использовать этот синтаксис для цикла

for ((index, value) in names.withIndex()) {
    println("$index: $value")
}

ссылка: https://kotlinlang.org/docs/tutorials/kotlin-for-py/loops.html

Для вашего конкретного случая я предлагаю иметь основной макет с начальным и конечным отступом, а также с горизонтальным верхним и нижним полями макета для создания пространства между элементами.

Если вы хотите использовать LinearLayouts, вы можете зайти в свой xml и добавить только Vertical LinearLayout.

После этого вы можете добавить Horizontal LinearLayouts для своих строк, в которые вы добавите ячейки, TextViews в вашем случае.

В "OnCreate" я получаю только представления и вызываю методы, используемые для добавления строк и ячеек в указанную строку.

public class MainActivity extends AppCompatActivity {

/**
 * @verticalLayout
 * Contains the rows of your String matrix
 */

LinearLayout verticalLayout;

/**
 * @rowCellDivisor
 * Contains the horizontal layout of each row
 */

LinkedList<LinearLayout> rows;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    verticalLayout = findViewById(R.id.verticalLayout);

    addRow();
    addRow();
    addRow();
    addRow();

    addTextViewToRow(0);
    addTextViewToRow(0);
    addTextViewToRow(0);
    addTextViewToRow(1);
    addTextViewToRow(1);
    addTextViewToRow(2);
    addTextViewToRow(2);
    addTextViewToRow(2);
    addTextViewToRow(2);
    addTextViewToRow(2);

}

Там мы создаем строку, которая представляет собой не что иное, как LinearLayout с горизонтальной ориентацией.

private void addRow(){

    LinearLayout row
            = new LinearLayout(
                    getApplicationContext()
    );

    row.setOrientation(LinearLayout.HORIZONTAL);
    row.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);

    verticalLayout.addView(row);

}

Это создает TextView для добавления в указанную строку.

private void addTextViewToRow(int rowAtPosition){

    TextView textView = new TextView(getApplicationContext());
    textView.setText("StartLongTextaaaaaaaaaaaaaaaaaaaaaaaa" +
            "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" +
            "ccccccccccccccccccccccccccccccLongTextEnd");

     /**
     * Third entry for params is for weight, so that you can
     * decide how much space the cell will occupy in the row
     * when there will be more than one view in the same row.
     */

    LinearLayout.LayoutParams layoutParams
            = new LinearLayout.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT,
            1f
    );

    /**
     * setMargins e.g. between cells of the row and screen
     * borders
     */

    layoutParams.setMargins(25, 0, 25, 25);

    textView.setLayoutParams(
            layoutParams
    );

    LinearLayout view = (LinearLayout) 
    verticalLayout.getChildAt(rowAtPosition);
    view.addView(textView);

}

}
Другие вопросы по тегам