19

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 );
}
}

ここに画像の説明を入力

4

5 に答える 5

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));

whereisSpaceOrTabは、すぐ上 (343 行目) で次のように定義されています。

boolean isSpaceOrTab = c == CHAR_SPACE || c == CHAR_TAB;

すべての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 = '-';

あなたの他のコメントを見ると、中国語を正しく破ろうとしていることがわかります。特別なことをする必要はないかもしれません:isIdeographic上記の呼び出しが示唆しているように、スペースを挿入せずに 2 つの表意文字の間を区切ろうとします。StaticLayoutこれを行うのはブレーカーのみDynamicLayoutです。改行文字のみを使用するため、静的テキストでのみ正しく改行されます。

残念ながら、私の調査によると、あなたはめちゃくちゃになっているようです。回避策としての私の唯一の提案は、 のWebView代わりにを使用し、限られた実装が提供TextViewする代わりに、システムの Web ブラウザーの優れた改行機能を使用することです。TextView

于 2012-12-06T17:10:57.017 に答える
6

Lollipop以来、\u200bサポートされています。

StaticLayoutこれは、 のネイティブ コールで実装されnLineBreakOpportunitiesます。

于 2015-06-01T12:59:36.263 に答える
-2

あなたのstrings.xmlで:

<string name="sample_string"><![CDATA[abc123<br />xyz987]]></string>

あなたの活動で:

TextView textView = (TextView) findViewById(R.id.myText);
textView.setText(Html.fromHtml(getResources().getString(R.string.sample_string)));

それが役に立てば幸い!

于 2012-12-06T16:36:33.540 に答える