gpt4 book ai didi

java - 仅在必要时在特定位置添加换行符

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:07:05 25 4
gpt4 key购买 nike

在我的 Android 布局中,我有一个使用屏幕可用宽度一半的 TextView。在运行时,我将文本设置为一个(长)电子邮件地址。例如:

googleandroiddeveloper@gmail.com

如果文本不适合一行,Android 会插入一个换行符,这是所需的行为。但是,换行符的位置在第一个不适合该行的字符之前。结果可能是这样的:

googleandroiddeveloper@gmai
l.com

我认为,这有点丑陋,尤其是在电子邮件地址中。我希望换行符出现在 @ 字符之前:

googleandroiddeveloper
@gmail.com

当然,我可以在我的strings.xml 中添加一个\n。但是电子邮件地址在每种情况下都会使用两行,即使它适合一行。

我认为我已经找到了向电子邮件地址添加零宽度空格 (\u200B) 的解决方案。

<string name="email">googleandroiddeveloper\u200B@gmail.com</string>

但除了标准空格之外,Android 不会将特殊空格字符检测为可断开空格,因此不会在此时添加换行符。

由于我在我的应用程序的多个地方处理大量的电子邮件地址,我正在寻找一种解决方案来在 @ 字符之前添加一个易碎且不可见的空间,以便 Android 包装电子邮件地址,如果不适合一行。

最佳答案

@Luksprog的方案很好,解决了很多情况下的问题。但是,我在几个方面修改了类(class),使其变得更好。这些是修改:

  • 我使用 onSizeChanged 而不是 onMeasure 来检查和操作文本,因为在使用 LinearLayout< 时 onMeasure 有问题layout_weight
  • 我通过使用 getPaddingLeft()getPaddingRight()
  • 考虑了文本的水平填充
  • 在测量 afterAt 时,我将 position 替换为 position + 1,否则生成的电子邮件地址包含两个 @ .

代码:

public class EmailTextView extends TextView {

public EmailTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// the width the text can use, that is the total width of the view minus
// the padding
int availableWidth = w - getPaddingLeft() - getPaddingRight();
String text = getText().toString();
if (text.contains("\n@")) {
// the text already contains a line break before @
return;
}
// get the position of @ in the string
int position = -1;
for (int i = 0; i < text.length(); i++) {
if (text.charAt(i) == '@') {
position = i;
break;
}
}
if (position > 0) {
final Paint pnt = getPaint();
// measure width before the @ and after the @
String beforeAt = text.subSequence(0, position).toString();
String afterAt = text.subSequence(position + 1, text.length())
.toString();
final float beforeAtSize = pnt.measureText(beforeAt);
final float afterAtSize = pnt.measureText(afterAt);
final float atSize = pnt.measureText("@");
if (beforeAtSize > availableWidth) {
// the text before the @ is bigger than the width
// so Android will break it
return;
} else {
if ((beforeAtSize + afterAtSize + atSize) <= availableWidth) {
// the entire text is smaller than the available width
return;
} else {
// insert the line break before the @
setText(beforeAt + "\n@" + afterAt);
}
}
}
}
}

这是 EmailTextView 与默认 TextView 对比的屏幕截图:

EmailTextView

对于所有电子邮件地址,它都按我预期的那样工作。最后一个地址没有更改,因为 @ 之前的文本已经太宽了,所以系统之前会破坏它,因此电子邮件地址有点乱,所以没有必要包括另一个换行符。

关于java - 仅在必要时在特定位置添加换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13726962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com