防止TextView中出现换行

18

在我的安卓应用中,我有一个文本视图来显示包含特殊字符的文本。这个TextView会自动在'/'和'-'这些特定字符处进行字符串换行。

例如,字符串“aaaaaaa/bbb-ccccc/ddd”将被显示为:

aaaaaaa/
bbb-
ccccc/
ddd

然而,我希望它在视图边界处仅有一个换行符的情况下显示,即像这样:

aaaaaaa/bb
bb-ccccc/d
dd

有没有办法取消自动换行或转义这些字符?我已经尝试使用\uFEFF进行转义,但没有成功。


尝试在每个转义字符前使用 \,例如 bbb-ccccc - Saqib
也许这篇帖子能帮到你: https://dev59.com/HVfUa4cB1Zd3GeqPJZeW - George Theodorakis
“\”被称为转义字符。因此,无论何时想要转义字符(例如aaaaaaa/bb),都应该使用这个字符。在这种情况下,通过在前面加上“\”来转义“/”。在其他情况下也应遵循相同的规则。 - Ramakishna Balla
使用'\'或'-'进行转义不起作用,会出现“无效的转义序列”错误。 - user3190568
9个回答

5

保留您的TextView属性

android:layout_width="wrap_content"
android:layout_height="wrap_content"

在string.xml文件中定义您的字符串

<string name="Username"> aaaaaaa\/bb\nbb\-ccccc\/d\ndd</string>

3
我认为原帖的作者正在寻找一个 textView 宽度恒定的解决方案。您的回答并没有考虑到这一点。 - suku
这解决了我的问题! - WHOATEMYNOODLES

5
也许这是一个解决方案:https://dev59.com/HX3aa4cB1Zd3GeqPcmju#22337074 我已经按照提到的方法添加了斜杠:
public class WordBreakTransformationMethod extends ReplacementTransformationMethod {
    private static WordBreakTransformationMethod instance;

    private WordBreakTransformationMethod() {}

    public static WordBreakTransformationMethod getInstance() {
        if (instance == null) {
            instance = new WordBreakTransformationMethod();
        }

        return instance;
    }

    private static char[] dash = new char[]{'-', '\u2011'};
    private static char[] space = new char[]{' ', '\u00A0'};
    private static char[] slash = new char[]{'/', '\u2215'};

    private static char[] original = new char[]{dash[0], space[0], slash[0]};
    private static char[] replacement = new char[]{dash[1], space[1], slash[1]};

    @Override
    protected char[] getOriginal() {
        return original;
    }

    @Override
    protected char[] getReplacement() {
        return replacement;
    }
}

4

这是Android 6中的新功能。

尝试将以下内容添加到您的TextView xml布局中

android:hyphenationFrequency="none"

4
Android TextView 遵循标准的 Unicode 换行算法:http://www.unicode.org/reports/tr14/tr14-45.html 摘录:/ 防止在其前面断开,允许在其后面换行 您可以通过在斜杠后面放置“单词连接器”字符(U+2060)来解决这个问题。
示例:strings.xml 中的代码为 aaaaaaa/\u2060bbb-ccccc/\u2060ddd
您还可以尝试使用 android:breakStrategy="balanced" 来保持每行大致相同长度。

3
这是我在Kotlin中的解决方案:最初的回答。
object WordBreakTransformationMethod : ReplacementTransformationMethod() {
    private val dash = charArrayOf('-', '\u2011')
    private val space = charArrayOf(' ', '\u00A0')
    private val slash = charArrayOf('/', '\u2215')

    private val original = charArrayOf(dash[0], space[0], slash[0])
    private val replacement = charArrayOf(dash[1], space[1], slash[1])

    override fun getOriginal() = original
    override fun getReplacement() = replacement
}

//tv_text is TextView
tv_text.apply {
    transformationMethod = WordBreakTransformationMethod
    text = item.text
}

1
解决了我的问题,关于位于RelativeLayout内部的TextView宽度为wrap_contents,最大宽度为200dp,重心为gravity_center。谢谢。 - March3April4

1
没有现成的解决方案,也没有所谓的“在TextView中按字母换行”的方法。唯一正确的做法是扩展TextView并修改Paint的breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth)函数。
此外,您可以计算TextView的像素大小,计算一个字母的像素宽度,然后找出每行适合的字母数(X),然后在每X个字母后插入换行符。

0
您可以通过以下方式计算文本的大小:
String text = "This is my text";
Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(14.0f);
Rect bounds = new Rect();
textPaint.getTextBounds(text, 0, text.length(), bounds);

bounds.width() // width in pixels
bounds.height() // height in pixels

基于这些值,您可以将文本分成多个部分并插入换行符。


0

设置行似乎可以工作,但是我如何计算动态文本所需的行数?我尝试使用getLineCount(),但在视图呈现之前它返回0。我试图通过textSize来计算所需的行数,但在知道TextView的宽度之前,我无法完全计算它,而宽度在渲染之前为0...看起来我正在打转。 - user3190568
只有在视图被创建后,您才能获取其宽度。如果您在活动中,请在OnPostCreate中进行宽度计算,您可以在那里获取其宽度。@user3190568 - Omid Heshmatinia

-1
我已经测试了以下代码。你甚至可以将它转换成一个函数:
    String specialString = "a/b/-c/d-d";
    String[] specialArray = specialString.split("/");
    String str = "";
    for(int i = 0; i < specialArray.length - 1; i++){
        str = str + specialArray[i] + Character.toString((char) 47);
    }
    str = str + specialArray[specialArray.length - 1];
    specialArray = str.split("-");
    str = "";
    for(int i = 0; i < specialArray.length - 1; i++){
        str = str + specialArray[i] + Character.toString((char) 45);
    }
    str = str + specialArray[specialArray.length - 1];
    textView.setText(str);

现在文本不再转义


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接