2012-01-02 4 views
1

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

Пример: «текст» string1 «больше текста» string2 «даже больше текста» и т.д.

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

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

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

+0

Чтение связанных SO нить - http://stackoverflow.com/questions/4283755/android-question-implementing-a-rich-text-editor – adatapost

ответ

6

Скорее всего, вы прочитали 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. Если вы хотите иметь 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); 
+0

Сегодня, наконец, в рамках моей программы, которые будут использовать это. Чтобы сделать его более ясным, что я делаю. Я беру одну длинную текстовую строку и вставляю в нее edittexts, и те edittexts будут иметь разный цвет. Текстовая строка хранится в базе данных, в то время как edittext работает над ними, но хочет вытащить их из строки, но только нашел способ преобразовать их в строковый массив вместо настройки отдельных строк в файле string.xml. BTW количество edittext и место, где они вписываются в текстовую строку, будут динамическими. Не имея проблем с сообщением программе, где поставить edittext – maebe

+0

Очень хорошо объяснено, спасибо! –