我有这样的布局(我删除了一些属性,因为它们真的没关系,完整的演示项目在这里):
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content" (* this is important)
android:layout_height="wrap_content"
android:breakStrategy="balanced" (* this is important)
android:text="@string/long_text" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
文本long_text很长,所以它会分开几行.
两条重要的路线是android:layout_width="wrap_content"和android:breakStrategy="balanced".
我希望TextView根据实际文本宽度计算宽度,但不会.
有人知道如何解决这个问题吗?
UPDATE
属性android:breakStrategy="balanced"仅适用于API 23更高版本.在我的示例中,文本占用3行,balanced策略使每行大致相同的宽度.
我希望在这种情况下,视图宽度本身将与最长线相同.
我正在寻找任何解决方法.我需要像环聊聊天一样的解决方案.我无法弄清楚它是如何工作的.
更新2
不幸的是,接受的答案不适用于RTL文本.
发生这种情况是因为当TextView计算其宽度时,它将所有文本都测量为1行(在您的情况下),并且在此步骤中它不知道android:breakStrategy.因此,它试图利用所有可用空间尽可能多地在第一行上呈现文本.
要获得更多详细信息,请在此处查看方法int desired(Layout layout)
要修复它,您可以使用此类:
public class MyTextView extends TextView {
public MyTextView(Context context) {
super(context);
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Layout layout = getLayout();
if (layout != null) {
int width = (int) Math.ceil(getMaxLineWidth(layout))
+ getCompoundPaddingLeft() + getCompoundPaddingRight();
int height = getMeasuredHeight();
setMeasuredDimension(width, height);
}
}
private float getMaxLineWidth(Layout layout) {
float max_width = 0.0f;
int lines = layout.getLineCount();
for (int i = 0; i < lines; i++) {
if (layout.getLineWidth(i) > max_width) {
max_width = layout.getLineWidth(i);
}
}
return max_width;
}
Run Code Online (Sandbox Code Playgroud)
}
我在这里 - 为什么包装内容在多行TextView填充父级?
| 归档时间: |
|
| 查看次数: |
2937 次 |
| 最近记录: |