Android布局 - 在没有包装和保留空间的情况下向右对齐

时间:2012-02-25 21:11:56

标签: android android-layout

我认为这是一个相当简单的布局,结果并非如此。

我在线性布局中有几行。

每一行都有一个“标题”,一个“标记”和一个“描述”。

说明显示在标题和标记下方,没有问题。

标题长度不确定,应与左上角对齐。标签应显示为与标题右侧对齐(如果标题较短,则不一定是父级的右边缘)。如果单行上没有足够的空间,则标题应该换行并为标记留出空间。

标签具有自己的风格和行为,并且必须是标题中的单独元素。

在我有限的经历中,我在RelativeLayouts上运气最好,所以这是我第一次尝试:

import android.content.Context;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class ExampleRow extends RelativeLayout {

    private TextView title;
    private TextView description;
    private TextView tag;

    public ExampleRow(Context context) {

        super(context);

        LayoutParams lp;        

        lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        title = new TextView(context);
        title.setId(1);
        addView(title, lp);                 

        lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.BELOW, title.getId());
        description = new TextView(context);
        description.setId(2);
        addView(description, lp);       

        lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.RIGHT_OF, title.getId());
        lp.addRule(RelativeLayout.ABOVE, description.getId());
        lp.setMargins(20, 0, 0, 0);
        tag = new TextView(context);
        addView(tag, lp);

    }
}

长标题会强制标签离屏。

然后我尝试嵌套的LinearLayouts - 主容器作为具有垂直方向的LinearLayout,其具有“顶行”,其是包含标题和标签的水平LinearLayout,并且底部“行”是描述。这有上述相同的问题。

接下来我尝试使用2个TableRows的TableLayout,但是这不仅失败了,而且还显示出奇怪的怪癖,例如根本没有渲染某些行,原因我不明白。 TableLayout和TableRow上的文档似乎有点稀疏,我无法找到处理列的XML字段的Java等价物。

布局需要使用Java而不是XML,原因太长且无趣,无法提及。

感谢任何见解。

TYIA。

/ EDIT

澄清要求,我能想到的最好的例子是HTML格式。

<table>
  <tr>
    <td>title</td>
    <td>tag</td>
  </tr>
  <tr>
    <td colspan="2">description...</td>
  </tr>
</table>

标签始终位于标题的右侧,但仅限于需要的位置(取决于标题宽度)。一旦它强制标签到最极端的权利,标题就会换行。

2 个答案:

答案 0 :(得分:1)

我认为这是你想要的布局:

public class TableLayoutCustom extends TableLayout {

    public TableLayoutCustom(Context context) {
        super(context);

        this.setColumnShrinkable(0, true);
        this.setColumnStretchable(1, true);

        TableRow row1 = new TableRow(context);

        TableRow.LayoutParams lp = new TableRow.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        TextView title = new TextView(context);
        title.setText("Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum ");

        title.setId(1);
        row1.addView(title, lp);

        lp.setMargins(20, 0, 0, 0);
        TextView tag = new TextView(context);
        tag.setText("TAG ME");
        row1.addView(tag, lp);

        this.addView(row1);

        TableRow row2 = new TableRow(context);
        TableRow.LayoutParams tlp = new TableRow.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        tlp.span = 2;
        TextView description = new TextView(context);
        description.setText("Description here");
        description.setId(2);
        row2.addView(description, tlp);

        this.addView(row2);
    }

}

如果您将标题上的文字更改为更短的内容,您会看到tag “跟随” title

答案 1 :(得分:0)

经过几次尝试,包括一个包含标题和标签的表格布局的线性布局,以及作为线性布局的子项的描述,我将发布我现在正在使用的内容。

虽然接近尾声,但我仍然愿意接受更好的答案:

在标题上使用右边距并在标签上使用相等数量的负左边距确实完成了基本想法,它假设我知道标签的大小。如果我允许说100像素,并且标签文本比那个长,它将换行。对于这个特定的设置来说这不是一个大问题(因为我有一组可预测的标签),我仍然有兴趣知道“正确”的方法。