2015-06-29 1 views
1

Я пытаюсь придать некоторый эффект стиля (например, полужирный, зачеркнутый) к первым двум словам в строке. То, как я это делаю, вдохновлено этим thread.Styling Two First Words With Spannable String

String[] tokens = text.split(" "); 
String twoFirstWords = tokens[0] + " " + tokens[1]; //two first words 

String content = text.replaceFirst(twoFirstWords, " "); //the rest 

SpannableStringBuilder builder = new SpannableStringBuilder(); 
SpannableString span1 = new SpannableString(twoFirstWords); 
SpannableString span2 = new SpannableString(content); 
span1.setSpan(new StyleSpan(Typeface.BOLD), 0, twoFirstWords.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE); 
span1.setSpan(new StrikethroughSpan(),0, twoFirstWords.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE); 
span1.setSpan(new CustomTypefaceSpan("", fontFirst), 0, twoFirstWords.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE); 
span2.setSpan(new CustomTypefaceSpan("", fontContent), 0, content.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE); 

builder.append(span1); 
builder.append(span2); 
textView.setText(builder, TextView.BufferType.SPANNABLE); 

на основе кода выше, я пытаюсь дать BOLD и зачеркивание только двух первых слов .. Однако эти эффекты также применяются к содержимому.

Этот код работал отлично, когда я применил стиль для двух последних слов в строке, но продолжаю терпеть неудачу при использовании первых слов. Я подозреваю, что это из-за неправильного начала и конца .SetSpan (или, может быть, это не так) ... Я также до сих пор не знаю, как правильно найти индекс для начала и конца. Кто-нибудь может помочь мне исправить эту проблему? Спасибо.

+1

попробуйте SPAN_EXCLUSIVE_EXCLUSIVE – pskink

+0

omg. это работает .. спасибо. один взнос для вас :) в любом случае .. что означает EXCLUSIVE_EXCLUSIVE и EXCLUSIVE_INCLUSIVE? – Lynx

+0

см. Http://stackoverflow.com/questions/16531555/what-is-the-difference-between-span-point-mark-and-span-mark-point – pskink

ответ

0

Хорошо, у нас есть вывод. Спасибо, пскинк!

Что мне нужно сделать, поэтому эффект не применяется к контенту, используя SPAN_EXCLUSIVE_EXCLUSIVE. Как показано ниже:

span1.setSpan(new StyleSpan(Typeface.BOLD), 0, twoFirstWords.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
0

Да, вы можете это сделать. То, как я это сделаю (поскольку это относительно простой материал), просто с HTML. Таким образом, вы можете сделать что-то вроде этого ...

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

textView.setText(Html.fromHtml("<b><strike>" + twoFirstWords 
    + "</b></strike>" + restOfTheSentence)); 

CommonsWare имеет большое сообщение в блоге, что перечислить все теги, что это поддерживает, что вы можете найти here.

+0

Благодарим за комментарий. Прямо сейчас, моя большая часть кода полна использования Spannable String ... Поэтому я действительно хочу знать, как исправить это, используя spannable string. Если вы знаете, как это поможет, это поможет. Спасибо за комментарий здесь! :) – Lynx

+0

@ Lynx Sure. Затем вы хотите создать одну строку, а затем задать интервалы для отдельных разделов. Я не думаю, что вы можете объединить два промежутка, добавив их так, как вы делали в своем вопросе. –