Добавить несколько TextView для просмотра динамически - PullRequest
1 голос
/ 06 марта 2020

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

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

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

enter image description here

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Если вы хотите использовать LinearLayouts, вы можете go добавить в 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);

}

}
0 голосов
/ 06 марта 2020

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

Вместо этого вы можете создать ресурс горизонтального макета, например:

 <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 - это основной вертикальный макет, к которому вы можете добавить отступы, или вы можете изменить свой горизонтальный, это зависит от того, чего вы хотите достичь.

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

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

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

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

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