- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的 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
对比的屏幕截图:
对于所有电子邮件地址,它都按我预期的那样工作。最后一个地址没有更改,因为 @
之前的文本已经太宽了,所以系统之前会破坏它,因此电子邮件地址有点乱,所以没有必要包括另一个换行符。
关于java - 仅在必要时在特定位置添加换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13726962/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!