TextView在breakStrategy ="balanced"和layout_width ="wrap_content"时出错

Ole*_* K. 7 android textview

我有这样的布局(我删除了一些属性,因为它们真的没关系,完整的演示项目在这里):

<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文本.

Gri*_*mmy 8

发生这种情况是因为当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填充父级?