Удалить лишние пробелы из строки в стиле


У меня есть большая строка в ресурсах (в основном на "о" текст приложения), который содержит стили (например , и т. д.). Строковый ресурс написан на нескольких строках, например:

<string name="about_text"><big><b>About</b></big>\n
Lorem ipsum dolor sit amet and all that stuff...\n
\n
More stuff.</string>

Теперь, как и в HTML, Андроид рассматривает фактические новых линий (не специальный \п) как пробелы, так текст становится чем-то вроде этого:

About
  Lorem ipsum dolor sit
amet and all that
stuff...

  More stuff.

Что выглядит довольно глупо. Теперь у меня два варианта:

  1. Пишите все в одной строке. Я не пошел с этим, потому что:
    1. Это будет довольно большая очередь.
    2. Текст должен быть переведен, и положить все это на одной линии даст переводчиков большая головная боль.
  2. Удалить ненужные пробелы программно.

Я пошел с Второе решение, но я не уверен, что моя реализация является оптимальным:

CharSequence aboutText = getText(R.string.about_text);

SpannableStringBuilder ssb = new SpannableStringBuilder(aboutText);
for (int i=0; i < ssb.length()-1; i++) {
    if (ssb.charAt(i) == '\n' && ssb.charAt(i+1) == ' ') {
        ssb.replace(i+1, i+2, "");
    }
}

this.aboutText = (TextView) findViewById(R.id.about_text);

this.aboutText.setText(ssb);

Кажется, очень программистские, но я не мог найти лучшего способа. Есть ли лучший способ?



Комментарии
5 ответов

Ответ-поставить новые строки в начале каждой строки, непосредственно перед текстом.

<string name="about_text"><big><b>About</b></big>
\nLorem ipsum dolor sit amet and all that stuff...
\n\nMore stuff.
</string>

Поэтому все избыточные пробелы появляется в конце каждой строки (например, после "О"), где она не влияет на внешний вид текста.

8
ответ дан 16 сентября 2011 в 11:09 Источник Поделиться

Поскольку это XML, вы можете использовать метод игнорирования пробелов, используя комментарии:

<string name="about_text"><big><b>About</b></big>\n<!--
-->Lorem ipsum dolor sit amet and all that stuff...\n<!--
-->\n<!--
-->More stuff.</string>

Он может быть уродливым, но этот метод имеет то преимущество, что фактическое содержание текста ваших XML точную строку, которую вы хотели, чтобы это было; никаких обходных путей в коде, а не в зависимости от каких-либо закидонов.

2
ответ дан 21 сентября 2011 в 08:09 Источник Поделиться

Это должно работать:

String aboutText = getText(R.string.about_text).toString();

aboutText = aboutText.replace("\n ", "\n");

метод toString() есть для преобразования в строку объект.

1
ответ дан 24 июня 2011 в 01:06 Источник Поделиться

Я не уверен string.xml такой хороший выбор или длинные строки.

По поводу диалога, я решила, что HTML-страницы в активы и использовать объект WebView (использовать strings.xml для хранения имени файла HTML для локали)

Это более гибкие и богатые возможностями.

1
ответ дан 23 декабря 2011 в 12:12 Источник Поделиться

Я думаю, что использование SpannableStringBuilder смысл. Вы могли бы принять характер.isSpaceChar() или символ.isWhitespace() если вы хотите легко обрезать лишние символы пробела.

Я понимаю, что это не прямо ответить на твой вопрос, но я писал подобную функцию, чтобы удалить пробелы из объект CharSequence в этот день:

public static CharSequence trimTrailingWhitespace(CharSequence source) {

if(source == null)
return "";

int i = source.length();

// loop back to the first non-whitespace character
while(--i >= 0 && Character.isWhitespace(source.charAt(i))) {
}

return source.subSequence(0, i+1);
}


Редактировать: я столкнулся с аналогичной проблемой сегодня утром, когда мне нужно было удалить внутренние пустые строки, так что я взял писательством в метод, который:


  • минимизирует количество вызовов на замену(), и

  • ручки другой формы пробельные символы, такие как символ перевода строки, табуляции и т. д.

Опять же, это не совсем решит вашу проблему (и как я уже указал, есть способы, чтобы обойти вашу проблему в источнике), но подход похож на этого будут пригодны для струнных вы не автор, например, скачали строк.

public static CharSequence removeExcessBlankLines(CharSequence source) {

if(source == null)
return "";

int newlineStart = -1;
int nbspStart = -1;
int consecutiveNewlines = 0;
SpannableStringBuilder ssb = new SpannableStringBuilder(source);
for(int i = 0; i < ssb.length(); ++i) {
final char c = ssb.charAt(i);
if(c == '\n') {
if(consecutiveNewlines == 0)
newlineStart = i;

++consecutiveNewlines;
nbspStart = -1;
}
else if(c == '\u00A0') {
if(nbspStart == -1)
nbspStart = i;
}
else if(consecutiveNewlines > 0) {

// note: also removes lines containing only whitespace,
// or nbsp; except at the beginning of a line
if( !Character.isWhitespace(c) && c != '\u00A0') {

// we've reached the end
if(consecutiveNewlines > 2) {
// replace the many with the two
ssb.replace(newlineStart, nbspStart > newlineStart ? nbspStart : i, "\n\n");
i -= i - newlineStart;
}

consecutiveNewlines = 0;
nbspStart = -1;
}
}
}

return ssb;
}

1
ответ дан 17 апреля 2012 в 08:04 Источник Поделиться