【问题标题】:Android Making a table look like I wantAndroid 使表格看起来像我想要的
【发布时间】:2012-04-24 14:24:57
【问题描述】:

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

这是我目前取得的成就:

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

    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);

【问题讨论】:

    标签: android user-interface tablelayout tablerow


    【解决方案1】:
    1. 如何使标题行高度更像行?

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

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

    我认为您在MessageRow 中有多个TextView,因此当您添加Button 时,它会移动到第一列(对应于第一列TextView)。如果是这种情况,请将您的Button span 设置为代表MessageRowTextViews 数量的列数:

    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 和另一个 MessageRowTablelayout 的子代,正确的 LayoutParams 是父代的 LayoutParamsTableLayout.LayoutParamsnot TableRow.LayoutParams

    2. 您在MessageRow 中添加一些TextView(根据我在您之前的问题中看到的),将带有TableRow.LayoutParams 的子视图添加到MessageRow

    3. 您在代码中的任何地方都只使用WRAP_CONTENT 作为LayoutParams,您可能希望将宽度(构造函数中的第一个参数)设置为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 行,您可以尝试设置一个带有分隔线的可绘制对象作为TableRowheaderMessageRow)的背景,而不是上述向布局添加另外 100 个视图的方法。

    补充说明:

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

    【讨论】:

    • 感谢您的详细回答,它提供了良好的线索。我将尝试使用 Row 的分隔符绘制背景(它会延伸到行宽吗?)。关于 WRAP_CONTENT/MATCH_PARENT 我尝试了按钮和 tablerow 上的所有组合但没有成功。 LayoutParams 导致标题行不显示(请参阅我的other post。跨度对我不起作用;还有其他 TextViews,可见性消失了。此外,当它们可见时,我将为每个按钮设置一个标题。
    • @ilomambo 可绘制对象将填充视图的宽度。我建议您尝试用ListView 替换您的TableLayout
    • @ilomambo 因为您将避免行填充/不填充整个宽度的问题,所以它将比您当前的 100 多个视图/布局提高性能。 ListView 已经在行之间有了一个分隔符,你可以很容易地让它看起来像 table。当然ListView 有其自身的问题,但我认为总体而言ListView 要好得多。无论如何,这只是一个建议。
    • 我尝试将 drawable 作为背景来绘制行分隔符,效果很好。只是不知道它将如何扩展到平板电脑。 Button size 也解决了,在研究您的建议时,我发现 android SDK 中包含一个 9patch 工具。我为按钮定义了一个新的 9 补丁,根本没有边距……瞧!按钮变小了。
    • 关于 ListView,如果我理解正确,我将不得不生成每一行看起来像一个表格。在我的情况下,我认为这不是一个选项,因为最后我希望能够“隐藏”列,这可以通过将可见性设置为 GONE 来简单地在表中完成。使用 ListView 方法,每次我想隐藏/显示一列时,我都必须重新生成行。
    【解决方案2】:

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

    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/horizontal-rule/

    【讨论】:

    • 1.会试试的。 *** 2.我已经在按钮上尝试了 MATCH_PARENT,结果相同。 *** 3.我的桌子在宽度上有 MATCH_PARENT,我什至将背景颜色设置为白色以准确查看它的结束位置。 *** $.我之前遇到过你的链接,如果我放这么多视图,我只是担心内存使用情况(在我的最终应用程序中,我希望管理数千行)
    • @ilomambo 在代码隐藏中找出布局可能很困难。我建议在 XML 布局中创建它并使用它,直到找到所需的布局,然后将其转录到代码隐藏逻辑中。我发现使用 XML 布局编辑器要容易得多。您可以在创建表的位置发布代码吗?为水平线创建 VIEW 的另一种方法是创建一个 9-patch 图像用作您的 textview 背景。创建一个底部有一条水平线的图像,并将其用作文本的“背景”并设置为 FILL_PARENT。
    • 我在问题中添加了表创建代码。 XML 在这里帮不了我,我也不知道如何在 XML 中做任何这些事情。我放弃了 VIEW 作为水平分隔符,请参阅我对 Luksprog 的回答。