我的问题与How to get a layout where one text can grow and ellipsize, but not gobble up the other elements on the layout非常相似,但请在下面阅读为何我不能使用TableLayouts。
我正在尝试创建一个基本上如下所示的listview行:
| TextView |查看1 |查看2 |
所有视图都包含可变宽度元素。 TextView具有ellipsize =“end”设置。视图1应该对齐TextView的左侧,而视图2应该对齐到屏幕的右侧。因此,通常,View 1和View 2之间会有空格。随着TextView中的文本变长,TextView应该增长,将View 1推向右侧,直到没有剩下的空白。然后,ellipsize应该启动,在TextView中剪切文本并在末尾附加省略号(“...”)。
所以,结果应该是这样的:
+----------------------------------------+
| short text [view1] [view2] |
+----------------------------------------+
| long text with ell ... [view1] [view2] |
+----------------------------------------+
我试过了:
这是我试过的GridLayout:
<GridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_gravity="left|fill_horizontal"
android:ellipsize="end"
android:singleLine="true"
android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis" />
<TextView
android:layout_gravity="left"
android:text="(view1)" />
<TextView
android:layout_gravity="right"
android:text="(view2)" />
</GridLayout>
View 1和View 2不是真正的TextViews,我只是在示例中使用它们来简化事情。
有没有办法在不使用TableLayouts的情况下实现这一目标?
修改 根据要求,这是我尝试使用RelativeLayout解决这个问题。在这种情况下,TextView占据了屏幕的整个宽度,因此view1和view2都不可见。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/rl0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:ellipsize="end"
android:singleLine="true"
android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis" />
<TextView
android:id="@+id/rl1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/rl0"
android:layout_marginLeft="10dp"
android:text="(view1)" />
<TextView
android:id="@+id/rl2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/rl1"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dp"
android:text="(view2)" />
</RelativeLayout>
答案 0 :(得分:18)
我似乎找到了一个潜在的解决方案来阻止GridLayout中的TextView无限增长并推出其他视图。不确定之前是否已经记录过。
您需要使用fill layout_gravity并在需要进行椭圆化处理的长TextView上设置任意layout_width或width。
android:layout_gravity="fill"
android:layout_width="1dp"
适用于GridLayout和android.support.v7.widget.GridLayout
答案 1 :(得分:8)
我是LinearLayouts的忠实粉丝,所以这是我的建议:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="1" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ellipsize="end"
android:singleLine="true"
android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="(view1)" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="(view2)" />
</LinearLayout>
答案 2 :(得分:3)
我建议您使用小部件的 layout_weight 属性
示例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="10">
<LinearLayout
android:id="@+id/ll_twoViewContainer"
android:layout_weight="8"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/rl0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_weight="1"
android:ellipsize="end"
android:singleLine="true"
android:text="Long text" />
<TextView
android:id="@+id/rl1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/rl0"
android:layout_weight="1"
android:minWidth="120dp"
android:text="(view1)" />
</LinearLayout>
<TextView
android:id="@+id/rl2"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/rl1"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dp"
android:text="(view2)" />
</LinearLayout>
</LinearLayout>
最后你的布局如下:
+----------------------------------------+
| short text [view1] [view2] |
+----------------------------------------+
| long text with ell ... [view1] [view2] |
+----------------------------------------+
答案 3 :(得分:3)
我认为你应该为自己的目的创建自定义布局。我不知道如何仅使用默认布局/视图来实现这一点,并使其适用于所有情况。
答案 4 :(得分:3)
对我有用的技巧是使用maxWidth来限制第一个视图的宽度。您需要使用Java,这是基本逻辑:
firstView.setMaxWidth(parentView.getWidth() - view2.getWidth() - view1.getWidth() - padding * 2);
不漂亮,但确实有效。
答案 5 :(得分:2)
我认为布局上只有一个小问题可以解决,将view3固定在右边并从那里开始强制视图有一个分隔区域(因此能够正确设置椭圆):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/rl3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="(view2)" />
<TextView
android:id="@+id/rl2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/rl3"
android:text="(view1)" />
<TextView
android:id="@+id/rl1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/rl2"
android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis" />
</RelativeLayout>
希望这会有所帮助......
问候!
答案 6 :(得分:0)
试试这个
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:orientation="horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:text="(view1)"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="(view2)"/>
</LinearLayout>
</LinearLayout>
目前,所有观点都集中在一起。您可以更改android:gravity
属性以满足您的需求。例如,您可能希望将view1
向右和view2
左对齐,在这种情况下,最后两个LinearLayout
看起来像(左右分别为5dp边距):
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center|right">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_marginRight="5dp"
android:text="(view1)"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center|left">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginLeft="5dp"
android:text="(view2)"/>
</LinearLayout>
答案 7 :(得分:0)
我找到了案例编号2的解决方案(带有长文本的解决方案):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="3" >
<TextView
android:id="@+id/rl0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3"
android:ellipsize="end"
android:singleLine="true"
android:text="Long text to demonstrate problem with TextView in GridLayout taking up too much space despite ellipsis" />
<TextView
android:id="@+id/rl1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1"
android:text="(view1)" />
<TextView
android:id="@+id/rl2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1"
android:text="(view2)" />
</LinearLayout>
真正的问题是案例一,我没有为此尝试很多事情。我希望它有所帮助(如果我有更多的业余时间,我会尝试实现第一个!)。
答案 8 :(得分:0)
如果右边的视图被设计推翻,你可以使用ListView而不是GridView。
您只需要将列表项布局的基础设为RelativeLayout,并设置如下规则:
您可以将右侧的两个视图设置为alignParentRight(使用android:layout_alignParentLeft =“true”),但要确保第一个视图保持在第二个视图的左侧,因此它会将自身推向左侧意见延伸。
您可以将左侧的TextView对齐到左侧,但保留在第一个视图的左侧(使用android:layout_toLeftOf =“@ + id / viewId”),这样它就不会与视图。
答案 9 :(得分:0)
尝试使用布局权重
<TableRow
android:id="@+id/tableRow3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/tableRow2"
android:layout_alignParentBottom="true"
android:gravity="center"
android:weightSum="10"
android:background="@android:color/black" >
<TextView
android:id="@+id/txtInningsTotal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:gravity="center"
android:text="0"
android:textColor="@android:color/white" />
<TextView
android:id="@+id/txtTeamOneTotal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2.5"
android:gravity="center"
android:text="0"
android:textColor="@android:color/white" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2" />
<TextView
android:id="@+id/txtTeamTwoTotal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2.5"
android:gravity="center"
android:text="0"
android:textColor="@android:color/white" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2" />
<TextView
android:id="@+id/txtGrandTotal"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:gravity="center"
android:text="0"
android:textColor="@android:color/white" />
</TableRow>
这里我采取了表格行,其中布局权重总和为10意味着它是其父级的100%宽度。并且在其所有子视图中,我将宽度设置为0Dp并将权重设置为1或2.因此它将占用总数10的百分比。因此布局将相应地调整屏幕并且也不会出现重叠问题。
如果我理解正确,那么这就是你想要的答案。
希望它有帮助!
答案 10 :(得分:0)
首先,您必须将[view 2]布局为parent Right;
再次,您引用了对最后两个布局的引用!
<Relativelayout android:layout_width="match_parent"
android:layout_height="wrap_content"
<TextView
android:id="@+id/view2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeft="@id/view2"
android:gravity="left">
<TextView
android:id="@+id/shortORlongtTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/view1"
android:ellipsize="end"
android:maxLines="1"
android:textSize="18dp"/>
<TextView
android:id="@+id/view1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
答案 11 :(得分:0)
网格布局遇到了同样的问题。我所做的是为文本视图提供固定的宽度,并为每个文本视图提供layout_columnWeight
属性,然后问题得到修复,希望它有帮助...
<TextView
android:id="@+id/txtName"
style="@style/MyDetailTitle"
android:layout_width="@dimen/detail_length"
android:layout_height="wrap_content"
android:text="@string/app_name"
app:layout_column="3"
app:layout_columnWeight="1"
app:layout_gravity="start"
app:layout_row="1" />
答案 12 :(得分:0)
GridLayout就像Android上的其他东西一样:设计存在缺陷。
您将需要一个自定义布局,以下示例将允许您布置以下内容:
int i;
char *p,**a,delim[]=" ";
a=malloc(100 * sizeof(char));
for(i = 0; i < 100; i++)
{
a[i]=calloc(MAX_STRING_LENGTH,sizeof(char));
}
while(!feof(stdin))
{
fgets(*a,500,stdin);
p=strtok(*a,delim);
}
玩得开心。
答案 13 :(得分:0)
TableLayout将给出预期的行为。正如问题的作者所述,可能会导致性能问题,但在简单的布局下效果很好。如果该行可重复且可滚动,请考虑使用gridview代替
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="1"
android:shrinkColumns="0"
>
<TableRow>
<TextView/>
<View1/>
<View2/>
</TableRow>
</TableLayout>