Подтвердить что ты не робот

Zero-width, разбивающее пространство для Android

Кто-нибудь знает, должен ли работать на Android как пространство с нулевой шириной, которое работает как разрыв строки, если длина TextView превышает текст TextView? Похоже, что только для меня это разрыв строки, но я не могу понять, как получить нулевую ширину. Я ожидаю, что это будет работать, по следующей ссылке, но это только пространство нулевой ширины и не сломается... и, как сказано, только \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 );
}
}

enter image description here

4b9b3361

Ответ 1

Я не считаю, что алгоритм линейного разбора понимает нулевой разброс строк или мягкие дефисы или символы разделителя строк или абзацев. Здесь код из источника 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));

где isSpaceOrTab определяется только выше (строка 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 выше намеков, он пытается сломать между двумя идеографами без вставки пробелов. Только прерыватель StaticLayout делает это: DynamicLayout использует только символы новой строки, поэтому он будет ломаться только по статическому тексту.

Я боюсь, что в моих исследованиях похоже, что вы ввернуты. Мое единственное предложение для работы было бы использовать WebView вместо TextView и использовать превосходные возможности для разграничения строк в системном веб-браузере вместо предложений ограниченной TextView.

Ответ 2

Так как поддерживается Lollipop, \u200b.

Это реализовано в StaticLayout с помощью обычного вызова nLineBreakOpportunities.

Ответ 3

Связано: Я просто протестировал использование символа символа пробела с нулевой шириной &#8203; как часть заголовка приложения, и обрабатывается так, как ожидалось, когда значок приложения отображается на рабочем столе ОС Android.

    <string name="app_name">
        App&#8203;Name&#8203;With&#8203;Many&#8203;Words
    </string>

Я попробовал это на Android 5.0; неизвестно, будет ли оно работать в более старых версиях.

Ответ 4

Try

textView.setText("abc" + System.getProperty("line.separator")+ " ...");

или запутаться с параметром ellipsize().

Ответ 5

В вашем файле 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)));

Надеюсь, что это поможет!

Ответ 6

Если вы хотите контролировать презентацию в браузере, вы можете попробовать встроенный класс с нулевой шириной в CSS:

.zw { display: inline-block; width: 0; }

Затем в HTML:

abc<span class="zw"> </span>123