适用于Android的零宽度打破空间

mma*_*len 19 android

有没有人知道如果TextView的文本超出了TextView长度,是否应该在Android上将其作为零宽度空间用作换行符?似乎只有\ u0020对我来说是破线,但我无法弄清楚如何获得它的零宽度版本.\ u200b是我期望应该工作的,按照以下链接,但它只做零宽度空间并且不会破坏......并且如上所述,只有\ u0020是断线.

http://www.cs.tut.fi/~jkorpela/chars/spaces.html

我附上了一个我正在使用的活动视图,用于测试U +代替\ u的地方.

我也尝试使用fromHtml选项来查看是否有一个Html选项可以工作,但没有任何运气与arial.

这是我正在使用的测试代码

public class TextSpaceActivity extends Activity {

public static void start( Context ctx ) {
    ctx.startActivity(  new Intent( ctx, TextSpaceActivity.class )  );
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.text_space_activity );
    setTitle( "TextSpaceActivity" );

    setText( R.id.tsa_txvw_1, "abc\u0020123\u0020xyz\u0020987" );
    setText( R.id.tsa_txvw_2, "abc\u200a123\u200axyz\u200a987" );
    setText( R.id.tsa_txvw_3, "abc\u200b123\u200bxyz\u200b987" );
}

TextView txvw;
private void setText( int txvwResId, String txt ) {
    txvw = (TextView)findViewById( txvwResId );
    txvw.setText( txt );
}
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Dan*_*lme 14

我不相信断行算法能够理解零宽度换行符或软连字符,或者用于此问题的行或段落分隔符.以下是Android源代码中的代码,用于确定此处是否存在换行符(android.text.StaticLayout源代码中的第358-366行):

// From the Unicode Line Breaking Algorithm (at least approximately)
boolean isLineBreak = isSpaceOrTab ||
        // / is class SY and - is class HY, except when followed by a digit
        ((c == CHAR_SLASH || c == CHAR_HYPHEN) &&
        (j + 1 >= spanEnd || !Character.isDigit(chs[j + 1 - paraStart]))) ||
        // Ideographs are class ID: breakpoints when adjacent, except for NS
        // (non-starters), which can be broken after but not before
        (c >= CHAR_FIRST_CJK && isIdeographic(c, true) &&
        j + 1 < spanEnd && isIdeographic(chs[j + 1 - paraStart], false));
Run Code Online (Sandbox Code Playgroud)

其中isSpaceOrTab定义的正上方(线343)为:

boolean isSpaceOrTab = c == CHAR_SPACE || c == CHAR_TAB;
Run Code Online (Sandbox Code Playgroud)

所有CHAR_常量都是普通的字符常量,所以没有什么比isspace继续下去了.同一文件中的第952-958行:

private static final char CHAR_FIRST_CJK = '\u2E80';

private static final char CHAR_NEW_LINE = '\n';
private static final char CHAR_TAB = '\t';
private static final char CHAR_SPACE = ' ';
private static final char CHAR_SLASH = '/';
private static final char CHAR_HYPHEN = '-';
Run Code Online (Sandbox Code Playgroud)

看看你的其他评论,我看到你正试图正确打破中文.你可能不需要做任何特别的事情:正如isIdeographic上面的调用提示,它试图在两个表意文字之间断开而不插入空格.只有StaticLayout断路器执行此操作:DynamicLayout仅使用换行符,因此它只会在静态文本上正确断开.

我害怕从我的研究中看起来你被搞砸了.我唯一的解决方案是使用a WebView而不是a TextView,并使用系统Web浏览器的优越的断行功能,而不是有限的实现TextView提供.


rds*_*rds 6

由于棒棒糖,\u200b支持。

这是StaticLayout通过本地调用实现的nLineBreakOpportunities