2012-02-25 44 views
0

我认为这将是一个相当简单的布局并不是事实。Android布局 - 右对齐,没有包装和预留空间

我在线性布局中有几行。

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

该描述出现在标题和标签下面,没有问题。

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

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

在我有限的经验,我有过的最运气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,底部“行”是描述。这与上述相同。

接下来我尝试了TableLayout和2个TableRows,但是这不仅失败了,而且还显示出奇怪的怪癖,就像我根本不理解的原因,根本不渲染某些行。 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> 

标签总是在标题的右侧,但只有在它需要的时候才是正确的(取决于标题宽度)。标题会在它将标签强制到最右端时进行包装。

回答

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

+0

标签需要在标题的右侧,不一定是父母的权利(除非标题太长)。我编辑了我的问题以更好地解释要求。 – momo 2012-02-25 21:34:32

+0

@BigMoMo我已经更新了我的答案。 – Luksprog 2012-02-26 11:12:56

+0

太好了,谢谢。 +1的收缩/拉伸/跨度成员,我找不到 – momo 2012-02-26 19:55:13

0

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

而这种接近,我还是开到一个更好的答案:

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