объединение нескольких строк и текста в Android - PullRequest
1 голос
/ 02 января 2012

Я довольно новичок в Android, Java и SQLite.Для моей первой программы я создаю программу, которая будет принимать пользовательский ввод и помещать его в предопределенный текст.

Пример: "текст" строка1 "больше текста" строка2 "еще больше текста" и т. Д.

Мой текст будет одного цвета, а строки будут отображаться другим цветом.

Я использую sqlite для разделения моих данных и кода, и именно здесь я ударился о стену.Пытаясь найти справку о том, как я смогу объединить свой текст выше в одну строку / столбец в моей таблице базы данных.

Используя только один приведенный выше пример, я мог бы запустить его.Но будет более 50 примеров, приведенных выше, для выпуска, что делает базу данных обязательной, особенно когда я хочу добавить больше после выпуска.

1 Ответ

6 голосов
/ 02 января 2012

Скорее всего, вы прочитали SpannableStringBuilder, что позволяет добавлять цвет к тексту в содержимом вашего TextView. Проверьте код ниже:

SpannableStringBuilder ssb = new SpannableStringBuilder(<your text>);
ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(255, 0, 0));

ssb.setSpan(fcs, 0, ssb.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(ssb); 

Приведенный выше код будет работать в большинстве случаев, однако вам нужно иметь разные чередующиеся цвета в одном TextView. Затем вы должны сделать следующее:

String text = your_text + text_from_database;
SpannableStringBuilder ssb = new SpannableStringBuilder(text);
ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(255, 0, 0));
ForegroundColorSpan fcs2 = new ForegroundColorSpan(Color.rgb(0, 255 0));

ssb.setSpan(fcs, 0, your_text, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(fcs2, your_text.length(), ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(ssb);

Приведенный выше код теперь будет работать, но вы заметите, что если вы добавите еще один текст your_another_text и захотите использовать предыдущий экземпляр fcs во второй раз, ранее окрашенный your_text потеряет свое форматирование (цвет). На этот раз вам нужно будет создать еще один ForegroundColorSpan fcs3 для форматирования третьей части SpannableStringBuilder. Ключевым моментом здесь является использование стиля символа в методе setSpan только один раз. Смотрите ниже:

String testTest = "abcdefgh";
String testTest2 = "ijklmnop";
String testTest3 = "qrstuvwxyz";

SpannableStringBuilder ssb = new SpannableStringBuilder(testTest+testTest2+testTest3);
ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(255, 0, 0));
ForegroundColorSpan fcs2 = new ForegroundColorSpan(Color.rgb(0, 255, 0));
ForegroundColorSpan fcs3 = new ForegroundColorSpan(Color.rgb(255, 0, 0));


ssb.setSpan(fcs, 0, testTest.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
ssb.setSpan(fcs2, testTest.length(), (testTest+testTest2).length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
ssb.setSpan(fcs3, (testTest+testTest2).length(), ssb.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

test.setText(ssb);

Этот метод хорош, если вы знаете, что в вашем SpannableStringBuilder есть фиксированное количество элементов String. Если вы хотите иметь TextView динамической длины и количества элементов, вам нужно сделать это другим способом. Для меня работало преобразование каждого строкового элемента в SpannableString, использование setSpan и append в TextView. Это полезно, если вы используете цикл для создания вашего TextView.

TextView test = (TextView)findViewById(R.id.test);

String testTest = "abcdefgh";
String testTest2 = "ijklmnop";
String testTest3 = "qrstuvwxyz";

SpannableString ssb = new SpannableString(testTest);
ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(255, 0, 0));
ForegroundColorSpan fcs2 = new ForegroundColorSpan(Color.rgb(0, 255, 0));
ForegroundColorSpan fcs3 = new ForegroundColorSpan(Color.rgb(255, 0, 0));

ssb.setSpan(fcs, 0, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
test.setText(ssb);

SpannableString ssb2 = new SpannableString(testTest2);
ssb2.setSpan(fcs2, 0, ssb2.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
test.append(ssb2);

SpannableString ssb3 = new SpannableString(testTest3);
ssb3.setSpan(fcs3, 0, ssb3.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
test.append(ssb3);
...