1

我在使桌子看起来像我打算的样子时遇到了一些麻烦。这是几个问题,但由于它们都参考了下面的图片和我提供的详细信息,我认为它们都应该放在一个帖子中。

这是我到目前为止所取得的成就:

在此处输入图像描述

标题行包含一个 Button 类型的元素。

    TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
    Button bt = new Button(getContext());
    bt.setText("Column1");
    mHeader.addView(bt, params);
    mHeader.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
    addView(mHeader);

表格的其余部分是这样填充的:
(Messagerow 扩展了 TableRow 并有一个 TextView 成员)

        for(int i = 0; i < 100; i++) {
            MessageRow mr = new MessageRow(getContext());
            // stuff to set the TexView text and color
            mr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
            this.addView(mr);
        }



1.如何使标题行高度更像行?

2.如何让按钮占据行的全宽?
如果表格是空的,没有文本行只是标题,那么按钮匹配行宽。一旦我添加一行文本,列宽就会被调整,但按钮宽度不会。

3. 如何让行填满屏幕宽度?(MATCH_PARENT 不这样做)

4. 如何在表格行之间画一条细线?
我试图覆盖 MessageRow 上的 onDraw() 函数,但它从未被调用,甚至一次也没有。

不要误会我的意思。我不是要求你为我做我的工作。这些是我试图自己解决的问题,并在谷歌上搜索并阅读了类似的帖子,但没有找到答案。
注意:我发现 Android 的 Javascript 中的 UI 设计缺乏对所有这些小细节的清晰控制和清晰的文档。

编辑
这是我创建表的方式:

    TableLayout mTable = new TableLayout(this);

    HorizontalScrollView hview = (HorizontalScrollView) findViewById(R.id.hscroll);

    populate(mTable);
    mTable.setLayoutParams(new TableLayout.LayoutParams( TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
    mTable.setBackgroundColor(Color.WHITE);

    hview.addView(mTable);
4

2 回答 2

2
  1. 如何使标题行高度更像行?

使用默认值Button没有什么可做的。使用Button九个补丁图像,在按钮的文本和您看到的边框之间有一些空间。您可以使用较小的字体,但您可能会看起来很难看。要尝试的另一件事是为 Button 使用您自己的背景并摆脱默认的额外空间(默认的九个补丁图像),因此最终高度接近TextViews 中文本的高度。或者尝试使用固定值对所有行强制执行标准高度。

  1. 如何使按钮占据行的整个宽度?

我认为你有不止一个TextViewMessageRow所以当你添加Button它时它会移动到第一列(对应于第一列TextView)。如果是这种情况,请Button 跨越TextViews代表in数量的列数MessageRow

TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT);
params.span = 3; // if you have 3 `TextView` in the MessageRow
    Button bt = new Button(getContext());
    bt.setText("Column1");
    mHeader.addView(bt, params);

如果不是这种情况,请添加更多详细信息。

  1. 如何使行填充屏幕宽度?(MATCH_PARENT 不这样做)

正如我在您之前的一个问题上所说的那样,我不知道为什么会发生这种情况(但我在那里为您提供了一些解决方案来克服这个问题)。还:

  1. mHeader另一个MessageRow是 a 的子级,Tablelayout正确LayoutParams使用它们的是LayoutParams父级的 the :TableLayout.LayoutParams不是 TableRow.LayoutParams

  2. TextViewMessageRow(从我在之前的问题中看到的)中添加一些,将这些子视图添加TableRow.LayoutParamsMessageRow

  3. 您仅在代码中的任何地方使用WRAP_CONTENTLayoutParams您可能希望将宽度(构造函数中的第一个参数)设置为FILL_PARENT/MATCH_PARENT

  1. 如何在表格行之间画一条细线?

您可以使用一个简单View的分隔符:

for(int i = 0; i < 100; i++) {
   MessageRow mr = new MessageRow(getContext());
   // stuff to set the TexView text and color
   mr.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, TableLayout.LayoutParams.WRAP_CONTENT));
   this.addView(mr);
   View separator = new View(getContext());
   separator.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, 3)));
   separator.setBackgroundColor(Color.RED);
   this.addView(separator);
}

因为您有 100 行,您可以尝试设置一个带有分隔线的可绘制对象作为TableRow(headerMessageRow) 的背景,而不是上述向布局添加另外 100 个视图的方法。

额外说明:

您有很多视图要添加到单个活动布局中,您正在谈论 100 行,如果您MessageRow比简单的更复杂TextView(我认为是),您可能会遇到一些性能问题。我建议你看看美妙的ListView小部件。

于 2012-04-23T16:35:21.350 回答
1

这里没有编程环境,但我会尝试回答你的一些问题。

  1. 您的标题行(按钮)比基于测试的行高的原因是按钮需要更多空间并且该行可以容纳它。默认按钮在文本的顶部/底部都有填充。我认为你最好的选择是创建你自己的按钮,这给你额外的好处是能够控制外观和感觉。似乎其他人以前也遇到过这个问题:Can't get rid of bottom padding on button

  2. 您的按钮设置为 wrap_content 这意味着它不会比它需要的大(它会增长/缩小,因此它可以适合文本“Column1”或您放在那里的任何内容)。我怀疑您需要将其设为 FILL_PARENT,而不是制作 Button WRAP。

  3. 不是您的表格行需要填充屏幕宽度,而是您的表格需要填充屏幕。无论您在哪里定义表,它都可能设置为水平维度的 WRAP_CONTENT。将它设置为 FILL_PARENT 并且您的表格应该扩展到它的容器的全宽(在这种情况下,它应该扩大屏幕的全宽)

  4. 可能有几种不同的方法可以做到这一点。我最近使用的一种方法是使用 View 标签,它基本上看起来像屏幕上的水平条。下面是如何实现它的链接。 http://sonnygill.net/android/horizo​​ntal-rule/

于 2012-04-23T16:46:31.260 回答