Android中的不间断冒号

时间:2016-03-05 11:14:50

标签: android scala line-breaks

我有以下文字:#include <algorithm> #include <cmath> #include <ctype.h> #include <iostream> #include <stdexcept> #include <string> bool is_number(const std::string& str) { return std::all_of(str.begin(), str.end(), ::isdigit); } namespace detail { int digit_sum_unsafe(const std::string& str) //Avoids code duplication { return std::accumulate(str.begin(), str.end(), 0, [](int sum, char c) { return sum + (c - '0'); }); } } int digit_sum(const std::string& str) { if(str[0] == '-') //Support for negative numbers str.erase(0, 1); if(not is_number(str)) //Proper exception handling throw std::domain_error("Not a number"); return detail::digit_sum_unsafe(str); } template <typename T> int digit_sum(T number) //Allows to use numbers without converting to string first { std::string str = std::to_string(number); if(str[0] == '-') str.erase(0, 1); return detail::digit_sum_unsafe(str); } int main() { //Quick test std::string s; std::cin >> s; std::cout << digit_sum(s); } 我希望这条线总是像这样断裂(确切的断点并不重要,但它不应该是冒号):

address:345346943693495349534963

在我的Android 4.2.2设备上,它如上所述中断,但在Android 6.0模拟器上它的行为有所不同:

address:3453469436934
95349534963

如何在所有设备上实现一致的破解行为?

当我在画布上绘制文本时会得到不同的结果,这里是代码(在Scala中):

address:
345346943693495349534963

3 个答案:

答案 0 :(得分:2)

看起来您正在寻找Word Joiner unicode代码点 https://en.wikipedia.org/wiki/Word_joiner

它也被称为零宽度不间断空间(ZWNBSP)。

根据这个问题: Zero-width line breaking space for Android

从第5版(Lollipop)开始,它应该在Android上受支持。对于soft-hypen也是如此(在PhilLab回复中建议)。

我建议您尝试一下,您可以在XML资源字符串中将其写为&#8203;。把它放在冒号和数字之间。

如果它在Lollipop之前不起作用并且您需要支持以前的平台,我唯一能想到的是测量文本,逐个字符,并且知道视图的可用宽度(您必须单独计算) ),在文本中手动添加要拆分的新行。

通过阅读本文,您可以了解文本测量在Android中的工作原理: https://chris.banes.me/2014/03/27/measuring-text/

也许有一种方法可以使用Spans,但我不知道任何。

答案 1 :(得分:0)

您可以使用soft hypens(\ u00AD),您必须将其放置在数字字符串中的多个点上:

address:3\u00AD453469\u00AD4369\u00AD349534953\u00AD4963

不幸的是,这会渲染连字符,我不知道这对你是否合适:

address:3453469436934-
95349534963

这也适用于TextViews的android:text属性。

P.S: 我也考虑过像这样使用Html:

Html.fromHtml("<span style="display: inline-block;">address:3</span>45346943693495349534963");

但遗憾的是我无法在Android

中运行

答案 2 :(得分:0)

    before draw a text on canvas follow following step and 

               String temp = "address:345346943693495349534963";
               String firstString=temp.substring(0, 21);
               [![enter image description here][1]][1]String secondString = temp.substring(20);
               String finalString = firstString+"\n"+secondString;

    now finally draw a text on canvas with "finalString",and if set text in textview then set final string in textview.

               TextView yourTextView = (TextView) findViewById(R.id.txt1);
               yourTextView.setText(finalString);


  [1]: http://i.stack.imgur.com/godJJ.png