如何使用自定义(水平和垂直)分隔符在运行时创建动态TableLayout

时间:2016-01-13 16:42:12

标签: android android-layout android-tablelayout

基本上我想创建一个动态创建TableLayout的函数,该函数包含我插入FrameLayout(容器)的水平和垂直自定义分隔符。我可以很容易地在XML中做到这一点,但我需要在运行时这样做,主要是因为我不知道表格会有多大,也可能很大(想要避免多次复制+粘贴XML代码)。

这就是我想要的东西(静态),但是用XML:

<TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/unitsTableContainer"
        android:layout_margin="30dp">

        <View style="@style/TableVerticalDivider"/>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <View style="@style/TableHorizontalDivider"/>

            <TextView style="@style/UnitTableDefaultText"/>

            <View style="@style/TableHorizontalDivider"/>

            <TextView style="@style/UnitTableDefaultText"/>

            <View style="@style/TableHorizontalDivider"/>

            <TextView style="@style/UnitTableDefaultText"/>

            <View style="@style/TableHorizontalDivider"/>

            <TextView style="@style/UnitTableDefaultText"/>

            <View style="@style/TableHorizontalDivider"/>

        </TableRow>

        <View style="@style/TableVerticalDivider"/>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <View style="@style/TableHorizontalDivider"/>

            <TextView style="@style/UnitTableDefaultText"/>

            <View style="@style/TableHorizontalDivider"/>

            <TextView style="@style/UnitTableDefaultText"/>

            <View style="@style/TableHorizontalDivider"/>

            <TextView style="@style/UnitTableDefaultText"/>

            <View style="@style/TableHorizontalDivider"/>

            <TextView style="@style/UnitTableDefaultText"/>

            <View style="@style/TableHorizontalDivider"/>

        </TableRow>

        <View style="@style/TableVerticalDivider"/>

    </TableLayout>

这是我在运行时(动态)执行此操作的最佳结果:

private void createTable() {
    TableLayout tableLayout;
    View verticalTableColumnDivider;
    View horizontalTableRowDivider;
    TableRow tableRow;
    TextView textView;

    tableLayout = new TableLayout(getApplicationContext());
    tableLayout.setStretchAllColumns(true);

    for (int currentRow = 0; currentRow < 2; currentRow++) {
        tableRow = new TableRow(getApplicationContext());

        verticalTableColumnDivider = getLayoutInflater().inflate(R.layout.template_vertical_table_divider, null);
        horizontalTableRowDivider = getLayoutInflater().inflate(R.layout.template_horizontal_table_divider, null);
        tableRow.addView(horizontalTableRowDivider);

        for (int currentColumn = 0; currentColumn < 4; currentColumn++) {
            textView = (TextView) getLayoutInflater().inflate(R.layout.template_default_table_text, null);
            tableRow.addView(textView);

            horizontalTableRowDivider = getLayoutInflater().inflate(R.layout.template_horizontal_table_divider, null);
            tableRow.addView(horizontalTableRowDivider);
        }
        tableLayout.addView(verticalTableColumnDivider);
        tableLayout.addView(tableRow);
    }

    verticalTableColumnDivider = getLayoutInflater().inflate(R.layout.template_vertical_table_divider, null);
    tableLayout.addView(verticalTableColumnDivider);

    FrameLayout tableLayoutContainer = (FrameLayout) findViewById(R.id.unitsTableContainer);
    tableLayoutContainer.addView(tableLayout);
}

以下是模板及其样式(当前样式位于一个XML文件中,所有3个模板都位于单独的布局XML文件中):

<View style="@style/TableHorizontalDivider"/>

<style name="TableHorizontalDivider">
    <item name="android:layout_width">4dp</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:background">?android:attr/listDivider</item>
    <item name="android:visibility">visible</item>
</style>

<View style="@style/TableVerticalDivider"/>

<style name="TableVerticalDivider">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">4dp</item>
    <item name="android:background">?android:attr/listDivider</item>
    <item name="android:visibility">visible</item>
</style>

<TextView style="@style/UnitTableDefaultText"/>

<style name="UnitTableDefaultText">
    <item name="android:textColor">#222222</item>
    <item name="android:text">Test</item>
    <item name="android:textSize">16sp</item>
    <item name="android:gravity">center</item>
    <item name="android:layout_gravity">center</item>
    <item name="android:layout_weight">1</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">0dp</item>
</style>

这里是结果,顶部表是动态制作的,底部表是它应该是什么但是静态地制作: result of my tries

将textViews放入TableLayout没有问题,因为你可以看到只有分隔符有问题,行分隔符太薄,列分隔符(如果仔细观察)它们也太薄并且堆叠在行分隔符上,不知道为什么它们水平绘制而不是垂直绘制。因此,如果有人知道为什么划分错误,和/或有解决方法如何做到这一点,请告诉我。

1 个答案:

答案 0 :(得分:1)

好的,我发现了如何做到这一点。我创建了一个类,您将文本内容放在表的String [] []中,并在运行时创建表:

public class SimpleTextTableWithBorders extends TableLayout {

private Context mContext;
private String[][] mTableContent;
private int mTextColor, mBorderColor;
private int mTextViewBorderWidth, mTableBorderWidth;

public SimpleTextTableWithBorders(Context context, String[][] tableContent) {
    super(context);
    mContext = context;
    mTableContent = tableContent;
    mTextColor = 0xff111111;
    mBorderColor = 0xAA444444;
    mTextViewBorderWidth = 4;
    mTableBorderWidth = mTextViewBorderWidth * 2;
    setupTable();
}

private void setupTable() {
    TableRow tableRow;
    TextView textView;

    setStretchAllColumns(true);
    setBackground(borderDrawable(mTableBorderWidth));
    setPadding(mTableBorderWidth, mTableBorderWidth, mTableBorderWidth, mTableBorderWidth);

    for (int currentRow = 0; currentRow < mTableContent.length; currentRow++) {
        tableRow = new TableRow(mContext);

        for (int currentColumn = 0; currentColumn < mTableContent[0].length; currentColumn++) {
            textView = new TextView(mContext);
            textView.setTextColor(mTextColor);
            textView.setBackground(borderDrawable(mTextViewBorderWidth));
            textView.setText(mTableContent[currentRow][currentColumn]);
            textView.setGravity(Gravity.CENTER);
            textView.setPadding(0, 6, 0, 6);
            tableRow.addView(textView);
        }
        addView(tableRow);
    }
}

private GradientDrawable borderDrawable(int borderWidth) {
    GradientDrawable shapeDrawable = new GradientDrawable();
    shapeDrawable.setStroke(borderWidth, mBorderColor);
    return shapeDrawable;
}

}

我正在寻找的关键是GradientDrawable。没有制定者和吸气者,但如果有人需要,你可以用其他有用的方法把它放在那里并根据需要使用它。

以下是示例结果: enter image description here