1

我需要向视图添加不确定数量的文本视图,如果它可以自动调整到屏幕,我会很高兴。

我尝试将水平 LinearLayouts 添加到垂直父 LinearLayout,但这样我可以每行添加 2 个或 3 个项目,但它没有这种无序的效果。

有什么办法可以做到这一点?

在此处输入图像描述

4

2 回答 2

1

我建议不要动态创建水平布局(如果你这样做的话)。

相反,您可以像这样创建水平布局资源:

 <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 行,如果你有一个要放入的文本列表,则在每个 cicle 中,你可以使用这种语法 for 循环

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

参考:https ://kotlinlang.org/docs/tutorials/kotlin-for-py/loops.html

对于您的具体情况,我建议使用填充开始和结束的主布局,并在顶部和底部的水平布局边距中创建元素之间的空间。

于 2020-03-06T11:58:24.710 回答
0

如果您想使用 LinearLayouts,您可以进入您的 xml 并仅添加一个 Vertical LinearLayout。

在此之后,您可以为您的行添加水平线性布局,您将向其中添加单元格,在您的情况下为 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);

}

}
于 2020-03-06T12:21:10.820 回答