Android: добавить слова в SpannableStringBuilder?

Я работаю над чем-то, и моя конечная цель —

А. Разноцветные слова в TextView

B. Получите ввод от пользователя и поместите это слово в TextView с определенным цветом

http://puu.sh/9wpuU/fcc558a48a.png

Итак, что я попытался сделать, так это нажать кнопку «ОК» в моем построителе предупреждений. Я взял SpannableStringBuilder, добавил новый вводимый пользователем текст и установил для этого диапазона определенный цвет. Но он удаляет все предыдущие цветовые диапазоны, которые у меня были (я полагаю, потому что вы можете иметь только один диапазон за раз в SpannableStringBuilder?). Есть ли способ обойти это? Вот что я пробовал. РЕДАКТИРОВАТЬ весь класс сейчас там

public class WritingScreen extends Activity {
String title;
String text;
String userInput;
TextView story;
SpannableStringBuilder sb;
ForegroundColorSpan fcs;
int colorTracker;
int currentCharCount;
int nextCharCount;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.writing_screen);
    story = (TextView) findViewById(R.id.storyText);
    sb = new SpannableStringBuilder(story.getText().toString());
    fcs = new ForegroundColorSpan(Color.rgb(255, 0, 0));
    currentCharCount = story.getText().length();


}
public void addTextClick(View v){
    final EditText input = new EditText(this);
    new AlertDialog.Builder(this)
            .setTitle("Input Word")
            .setView(input)
            .setPositiveButton("Ok",
                    new DialogInterface.OnClickListener() {
                        public void onClick(
                                DialogInterface dialog, int whichButton) {
                            String value = input.getText().toString().trim();
                            value = " " + value;
                            sb = new SpannableStringBuilder(story.getText());
                            sb.append(value);
                            nextCharCount = sb.length();
                            sb.setSpan(fcs, currentCharCount, nextCharCount, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                            story.setText(sb);
                            currentCharCount = nextCharCount;




                        }
                    })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int whichButton) {

                        }
                    })
            .show();

    }

}

Это дает мне это

http://puu.sh/9wq7z/7b7fb2f909.jpg

Когда я ввожу OK jj meh подряд. Я хочу, чтобы все они оставались того цвета, который я присвоил каждому слову в первую очередь. Любые идеи?


person user3055557    schedule 16.06.2014    source источник


Ответы (1)


Во-первых, story.getText().toString() преобразует текущий Spannable в строку, которая теряет всю информацию о разметке. Вместо этого вы должны использовать sb.append(story.getText()).

Во-вторых, вы должны создавать новый Span каждый раз -- судя по коду setSpan(), похоже, что если такой же диапазон уже найден в билдере, он будет изменен. Это, вероятно, причина, по которой вы теряете предыдущее форматирование.

Например:

int[] colors = new int[] { Color.RED, Color.BLUE, Color.GREEN, Color.YELLOW };
ForegroundColorSpan fcs = new ForegroundColorSpan(colors[new Random().nextInt(colors.length)]);

SpannableStringBuilder sb = new SpannableStringBuilder(mTextView.getText());
int currentCharCount = sb.length();
sb.append(mEditText.getText().toString().trim());
int nextCharCount = sb.length();

sb.setSpan(fcs, currentCharCount, nextCharCount, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView.setText(sb);
person matiash    schedule 16.06.2014
comment
Я попробовал то, что вы сказали, я избавился от текстовой строки и теперь имею sb = new SpannableStringBuilder(story.getText()); sb.append (значение); следующийCharCount = sb.length(); sb.setSpan(fcs, currentCharCount, nextCharCount, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); К сожалению, тот же результат. - person user3055557; 16.06.2014
comment
@ user3055557 Ммм, хорошо. Пожалуйста, расширьте/обновите свой фрагмент, чтобы получить больше контекста. - person matiash; 16.06.2014
comment
Хорошо, я добавил весь класс, надеюсь, это поможет! - person user3055557; 17.06.2014
comment
Эй, это работает отлично! Я был очень близок, главное отличие, которое я заметил, это то, что вы каждый раз создаете новую fcs, вы думаете, что это было? Или я просто так пытался обновить sb? - person user3055557; 17.06.2014
comment
@ user3055557 Да, именно так. Проверьте исходный код для SpannableStringBuilder.setSpan(). Если вы укажете предыдущий диапазон, он будет обновлен. - person matiash; 17.06.2014