如何使水平线性布局 Child 包裹其内容?
How to make horizontal Linear Layout Child wrap its content?
如标题所示,在我的案例中,child 视图是一个包含一些内容的 TextView
。我希望每行一个
所以把 layout_width
放到 0dp
和把 layout_weight
添加到 1
没有用,我假设因为它是行中唯一的所以 1
是最高权重...不过不确定
这是 xml:
<LinearLayout
android:id="@+id/tagsVerticalLineup"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
最后我想要一个接一个垂直排列(每行一个)
以水平大小作为文本长度(内容)
Linear Layout
这甚至可能吗?
谢谢
编辑:
由于@Ajil O 回答有效,我自己的问题仍然存在。我隔离了主要区别。
在我的项目中,我使用 Inflate
从代码中添加了 Text View
,因为我有默认样式。
充气代码:
final LinearLayout tagAreaView = (LinearLayout) findViewById(R.id.tagsVerticalLineup);
TextView tag = (TextView) getLayoutInflater().inflate(R.layout.answer_tag, null);
int tagId = someListArray.size();
tag.setId(tagId);
tag.setText(someChangingObject.text);
tagAreaView.addView(tag, tagId);
文本视图 answer_tag
:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SelectedTagAnswer" />
风格xmlSelectedTagAnswer
:
<style name="SelectedTagAnswer">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginStart">8dp</item>
<item name="android:layout_marginEnd">16dp</item>
<item name="android:background">@drawable/selected_answer</item>
<item name="android:drawablePadding">8dp</item>
<item name="android:gravity">center_horizontal</item>
<item name="android:drawableStart">@drawable/ic_cross_round</item>
<item name="android:elevation">3dp</item>
<item name="android:paddingBottom">8dp</item>
<item name="android:paddingEnd">25dp</item>
<item name="android:paddingStart">15dp</item>
<item name="android:paddingTop">8dp</item>
</style>
注意:
当插入使用相同样式的简单 Text View
到 xml 时,
它像@Ajil O 的回答一样工作。膨胀过程中的一些东西搞砸了。
只需在 android:layout_width
中使用 wrap_content
参数即可,您现在使用的是 0dp
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/tagsVerticalLineup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
将 LinearLayout
宽度设为 match_parent
,将高度设为 wrap_content
<LinearLayout
android:id="@+id/tagsVerticalLineup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
如果你想让TextView
占1行使用android:maxLines="1"
属性
编辑
TextView
现在都是彩色的。您可以看到 TextView
与其内容一样宽。
容器,LinearLayout
以淡紫色(?)着色。此 LinearLayout
必须 atleast 与 longest TextView
一样宽,否则视图(或其内容)将得到剪掉了。
<LinearLayout
android:id="@+id/tagsVerticalLineup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:background="#AAAAFF"
android:layout_gravity="center">
<TextView
android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#080"
android:text="small text"
android:textColor="#FFF"
android:textSize="18sp"
android:maxLines="1"/>
<TextView
android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Slightly longer text"
android:background="#400"
android:textColor="#FFF"
android:textSize="18sp"
android:maxLines="1"/>
<TextView
android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="loooooooooooooooooong text"
android:background="#008"
android:textColor="#FFF"
android:textSize="18sp"
android:maxLines="1"/>
</LinearLayout>
您最好使用 ContrainstLayout,您可以将任何事件操作到您想要的尺寸
终于找到了解决方案,结果是 Android 显示后不会用 wrap_content
刷新视图布局。
在这个答案中找到 WRAP_CONTENT not working after dynamically adding views
所以我的问题是膨胀视图然后添加内容(文本)。
为了克服这个问题,我再次设置了高度和宽度,如下所示:
tag.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
现在,如果 答案中的所有内容都得到了实施,那就行得通了!
希望这个边缘案例将来能派上用场
试试这个
- 制作父布局的
Height and Width=match_parent
textView
使宽度 match_parent
这样你就可以使用 textalignment=centre
或者你可以使用 gravity=centre
<LinearLayout
android:id="@+id/tagsVerticalLineup"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"/>
</LinearLayout>
如标题所示,在我的案例中,child 视图是一个包含一些内容的 TextView
。我希望每行一个
所以把 layout_width
放到 0dp
和把 layout_weight
添加到 1
没有用,我假设因为它是行中唯一的所以 1
是最高权重...不过不确定
这是 xml:
<LinearLayout
android:id="@+id/tagsVerticalLineup"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
最后我想要一个接一个垂直排列(每行一个) 以水平大小作为文本长度(内容)
Linear Layout
这甚至可能吗?
谢谢
编辑: 由于@Ajil O 回答有效,我自己的问题仍然存在。我隔离了主要区别。
在我的项目中,我使用 Inflate
从代码中添加了 Text View
,因为我有默认样式。
充气代码:
final LinearLayout tagAreaView = (LinearLayout) findViewById(R.id.tagsVerticalLineup);
TextView tag = (TextView) getLayoutInflater().inflate(R.layout.answer_tag, null);
int tagId = someListArray.size();
tag.setId(tagId);
tag.setText(someChangingObject.text);
tagAreaView.addView(tag, tagId);
文本视图 answer_tag
:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SelectedTagAnswer" />
风格xmlSelectedTagAnswer
:
<style name="SelectedTagAnswer">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginStart">8dp</item>
<item name="android:layout_marginEnd">16dp</item>
<item name="android:background">@drawable/selected_answer</item>
<item name="android:drawablePadding">8dp</item>
<item name="android:gravity">center_horizontal</item>
<item name="android:drawableStart">@drawable/ic_cross_round</item>
<item name="android:elevation">3dp</item>
<item name="android:paddingBottom">8dp</item>
<item name="android:paddingEnd">25dp</item>
<item name="android:paddingStart">15dp</item>
<item name="android:paddingTop">8dp</item>
</style>
注意:
当插入使用相同样式的简单 Text View
到 xml 时,
它像@Ajil O 的回答一样工作。膨胀过程中的一些东西搞砸了。
只需在 android:layout_width
中使用 wrap_content
参数即可,您现在使用的是 0dp
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/tagsVerticalLineup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
将 LinearLayout
宽度设为 match_parent
,将高度设为 wrap_content
<LinearLayout
android:id="@+id/tagsVerticalLineup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
如果你想让TextView
占1行使用android:maxLines="1"
属性
编辑
TextView
现在都是彩色的。您可以看到 TextView
与其内容一样宽。
容器,LinearLayout
以淡紫色(?)着色。此 LinearLayout
必须 atleast 与 longest TextView
一样宽,否则视图(或其内容)将得到剪掉了。
<LinearLayout
android:id="@+id/tagsVerticalLineup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:background="#AAAAFF"
android:layout_gravity="center">
<TextView
android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#080"
android:text="small text"
android:textColor="#FFF"
android:textSize="18sp"
android:maxLines="1"/>
<TextView
android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Slightly longer text"
android:background="#400"
android:textColor="#FFF"
android:textSize="18sp"
android:maxLines="1"/>
<TextView
android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="loooooooooooooooooong text"
android:background="#008"
android:textColor="#FFF"
android:textSize="18sp"
android:maxLines="1"/>
</LinearLayout>
您最好使用 ContrainstLayout,您可以将任何事件操作到您想要的尺寸
终于找到了解决方案,结果是 Android 显示后不会用 wrap_content
刷新视图布局。
在这个答案中找到 WRAP_CONTENT not working after dynamically adding views
所以我的问题是膨胀视图然后添加内容(文本)。
为了克服这个问题,我再次设置了高度和宽度,如下所示:
tag.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
现在,如果
希望这个边缘案例将来能派上用场
试试这个
- 制作父布局的
Height and Width=match_parent
textView
使宽度match_parent
这样你就可以使用textalignment=centre
或者你可以使用gravity=centre
<LinearLayout
android:id="@+id/tagsVerticalLineup"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"/>
</LinearLayout>