我的布局有一个奇怪的问题:
<?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:orientation="horizontal"
android:layout_marginTop="15dp">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="#ff3333"
android:layout_weight="0.2"
/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="0.8">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="#ff134415"
android:layout_weight="1"
/>
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<View
android:layout_width="3dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<View
android:layout_width="5dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<View
android:layout_width="10dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ff8833"
android:paddingRight="10dp"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="this is a longgggggggggggggggggggggggg text"
/>
</LinearLayout>
</LinearLayout>
当textview的文本很长时,它的一部分超出了linearlayout宽度。我哪里做错了?
答案 0 :(得分:2)
这个问题是由于你的80%布局不是所有的孩子都指定了一个重量 AND 一些不这样做的人 - 他们有一个优先的大小来做总和所有孩子都比父母提供的要大。
在这种情况下,layout_weight的运行方式是:让每个人占用他们需要的空间,我将采取其余的,达到我父母允许的最大值。问题是,在这种情况下,没有休息(或者如果我可以这样说是负面的:-))。我不太详细了解布局算法,但我认为布局有权重!= 0将推动它之后的所有布局 - 因此样本中较大的TextView
将离开屏幕。
为了验证我的假设,我构建了一个更简单的布局,只有2个TextView:第一个宽度= 0,权重= 1,短文本;第二个是width = wrap和更长的文本 - 基本上是样本中80%布局的第一个和最后一个视图。看看发生同样的事情。一旦你在第二个上加权,它就会停止,因为现在布局算法的功能基于所有孩子的权重:
<?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:orientation="horizontal"
android:layout_marginTop="15dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#008833"
android:paddingRight="10dp"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="short text"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ff8833"
android:paddingRight="10dp"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="this is an even longgggggggggggggggggggggggggggggeeerrrr text" />
</LinearLayout>
我想在这种情况下学到的教训是:不要仅在某些子视图上使用权重,除非绝对保证布局它们所需的空间小于父级的大小。
一开始似乎是一个简单的布局问题,但是男孩,我从中学到了什么......我只能希望我做对了: - )
答案 1 :(得分:2)
添加另一个LinearLayout
负责文本视图的剩余填充,然后原始LinearLayout
负责绿色视图的剩余填充。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="15dp">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="#ff3333"
android:layout_weight="0.2"
/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="0.8">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="#ff134415"
android:layout_weight="1"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<View
android:layout_width="3dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<View
android:layout_width="5dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<View
android:layout_width="10dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#ff8833"
android:paddingRight="10dp"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="this is a longgggggggggggggggggggggggg text"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
答案 2 :(得分:0)
为textview赋予权重,以便文本视图的宽度相同。
并且还提供以下两个属性:
android:singleLine="true"
android:ellipsize="end"
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="#ff8833"
android:layout_weight="1"
android:paddingRight="10dp"
android:paddingLeft="15dp"
android:singleLine="true"
android:ellipsize="end"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="this is a longgggggggggggggggggggggggg text"
/>
答案 3 :(得分:-1)
您必须从linearlayout和视图中删除宽度0dp。使用权重参数,如下所示:
<?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:orientation="horizontal"
android:layout_marginTop="15dp">
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff3333"
android:layout_weight="1"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="1">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="#ff134415"
android:layout_weight="1"
/>
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<View
android:layout_width="3dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<View
android:layout_width="5dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<View
android:layout_width="10dp"
android:layout_height="match_parent"
android:background="#ff8833"
android:layout_marginRight="2dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ff8833"
android:paddingRight="40dp"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="this is a longgggggggggggggggggggggggg text"
/>
</LinearLayout>
</LinearLayout>
您可以在textview广告示例(30-40dp)中添加更多填充,以便不发布文字。