2015-07-25 4 views
0

Я пытаюсь отобразить TextView с типом «фишек» для каждого слова. Другими словами, я бы хотел, чтобы это Splitwise TokenAutoComplete не редактировалось и не было автозаполнено.TextView с различным стилем для каждого слова

Так что у меня вытяжке для моего стиля:

muscle_token_background.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" > 
<solid android:color="@color/primary_dark" /> 
<corners 
    android:topLeftRadius="5dp" 
    android:bottomLeftRadius="5dp" 
    android:topRightRadius="5dp" 
    android:bottomRightRadius="5dp" /> 
</shape> 

У меня есть свой стиль, которые используют вытяжке:

themes.xml

<resources> 
    <style> 
     ..... 
    </style> 
    <style name="textview_chips" parent="@android:style/TextAppearance.Medium"> 
     <item name="android:background">@drawable/muscle_token_background</item> 
    </style> 
</resources> 

И решение, которое я нашел это использовал SpannableStringBuilder с SyleSpan:

SpannableStringBuilder sb = new SpannableStringBuilder(myString); 
int currentCharCount = sb.length(); 
sb.append(myString.trim()); 
int nextCharCount = sb.length(); 
sb.setSpan(new StyleSpan(R.style.textview_chips), currentCharCount, nextCharCount, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
myTextView.setText(sb); 

Но TextView только станет наклонным.

Я попытался с другим TextView в файл XML и фоновый Drawable хорошо отображается

<TextView 
    ... 
    style="@style/textview_chips" 
    ... /> 

Так как я могу сделать, чтобы применить этот стиль для каждого слова моего TextView?

+0

'StyleSpan' не предназначен для применения ресурсов стиля, как вы определили в своем' styles.xml'. Это для текста полужирным, курсивом, как жирным, так и курсивом, или нормальным. Конструктор ожидает значения, определенные в классе 'Typeface', которые соответствуют жирным/italic/etc состояниям. В зависимости от того, какой фон вы хотите, может быть другой вид диапазона, который будет работать (например, «BackgroundColorSpan»), но вам нужно будет предоставить дополнительную информацию. – Karakuri

ответ

0

Я, наконец, сделал это!

MyUtils.class

public static Object convertViewToDrawable(View view) { 
    int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
    view.measure(spec, spec); 
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 
    Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), 
      Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(b); 
    c.translate(-view.getScrollX(), -view.getScrollY()); 
    view.draw(c); 
    view.setDrawingCacheEnabled(true); 
    Bitmap cacheBmp = view.getDrawingCache(); 
    Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true); 
    view.destroyDrawingCache(); 
    return new BitmapDrawable(viewBmp); 
} 

MyActivity

String regex = "\\w+"; 
Pattern p = Pattern.compile(regex); 
Matcher matcher = p.matcher(myString); 
SpannableStringBuilder sb = new SpannableStringBuilder(myString); 
while (matcher.find()) { 
     final LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final View parent = (View) layoutInflater.inflate(R.layout.muscle_token, null); 
     final TextView oneWord = (TextView) parent.findViewById(R.id.muscle_name); // The TextView to convert into Drawable 
     final int begin = matcher.start(); 
     final int end = matcher.end(); 
     float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 15, getResources().getDisplayMetrics()); 
     oneWord.setTextSize(pixels); 
     oneWord.setText(concatString.substring(begin, end).toString()); 
     BitmapDrawable bd = (BitmapDrawable) MyUtils.convertViewToDrawable(oneWord); 
     bd.setBounds(0, 0, bd.getIntrinsicWidth(),bd.getIntrinsicHeight()); 
     sb.setSpan(new ImageSpan(bd), begin, end, 0); 
} 
myTextView.setText(sb); 

muscle_token.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_height="wrap_content" 
android:layout_width="wrap_content"> 

<TextView android:id="@+id/muscle_name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/muscle_token_background" 
    android:padding="5dp" 
    android:textColor="@color/icons" 
    android:textSize="15sp" /> 

</LinearLayout> 

Благодаря How can I use onTouchListeners on each word in a TextView? https://krishnalalstha.wordpress.com/2012/06/07/making-gosmsproevernote-like-edittext/

Смежные вопросы