基本上我想创建一个动态创建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没有问题,因为你可以看到只有分隔符有问题,行分隔符太薄,列分隔符(如果仔细观察)它们也太薄并且堆叠在行分隔符上,不知道为什么它们水平绘制而不是垂直绘制。因此,如果有人知道为什么划分错误,和/或有解决方法如何做到这一点,请告诉我。
答案 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。没有制定者和吸气者,但如果有人需要,你可以用其他有用的方法把它放在那里并根据需要使用它。