Подтвердить что ты не робот

Примените два разных стиля шрифта к TextView

Я хочу применить два разных стиля шрифта к тексту в одном TextView.

Мой случай такой же, как Android - два предложения, два стиля, один TextView. Единственное различие заключается в том, что я хочу настроить пользовательский шрифт на весь текст. Я включил Helvetica Font в качестве активов в моем проекте и хочу применить этот шрифт к TextView с первой частью текста будет Helvetica BOLD и оставшаяся часть Helvetica NORMAL. Любые предложения, как это можно сделать?

Текст необходим в следующем формате. Пользовательский текст с разными стилями и отдельным текстом.

enter image description here

4b9b3361

Ответ 1

Один из способов сделать это - расширить TypefaceSpan:

import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.text.style.TypefaceSpan;

    public class CustomTypefaceSpan extends TypefaceSpan {
        private final Typeface newType;

        public CustomTypefaceSpan(String family, Typeface type) {
            super(family);
            newType = type;
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            applyCustomTypeFace(ds, newType);
        }

        @Override
        public void updateMeasureState(TextPaint paint) {
            applyCustomTypeFace(paint, newType);
        }

        private static void applyCustomTypeFace(Paint paint, Typeface tf) {
            int oldStyle;
            Typeface old = paint.getTypeface();
            if (old == null) {
                oldStyle = 0;
            } else {
                oldStyle = old.getStyle();
            }

            int fake = oldStyle & ~tf.getStyle();
            if ((fake & Typeface.BOLD) != 0) {
                paint.setFakeBoldText(true);
            }

            if ((fake & Typeface.ITALIC) != 0) {
                paint.setTextSkewX(-0.25f);
            }

            paint.setTypeface(tf);
        }
    }

Затем, когда вы хотите использовать два разных шрифта, вызовите:

String firstWord = "first ";
String secondWord = "second";

// Create a new spannable with the two strings
Spannable spannable = new SpannableString(firstWord+secondWord);

// Set the custom typeface to span over a section of the spannable object
spannable.setSpan( new CustomTypefaceSpan("sans-serif",CUSTOM_TYPEFACE), 0, firstWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan( new CustomTypefaceSpan("sans-serif",SECOND_CUSTOM_TYPEFACE), firstWord.length(), firstWord.length() + secondWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// Set the text of a textView with the spannable object
textView.setText( spannable );

Ответ 2

Вот решение, более простое, вы можете использовать HTML для установки разных стилей на одном и том же TextView.

Например:

// Styled label
String styledText = "<big><b><font color='#333333'>title</font></b></big> <small><b><font color='#CC5490'>subtitle</font></b></small>";

// Apply the styled label on the TextView
textView.setText(Html.fromHtml(styledText));

Вам понадобится следующий импорт:

import android.text.Html;

Ответ 3

Это может сработать - создайте свой собственный TextView, а затем используйте StyleSpan по одной части:

public class CustomTextView extends TextView {

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setTypeface(Typeface tf, int style) {
        if (style == 1){
            //replace "HelveticaBOLD.otf" with the name of your bold font
            tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaBOLD.otf");
        }else{
            //replace "HelveticaNORMAL.otf" with the name of your normal font
            tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaNORMAL.otf");
        }
        super.setTypeface(tf, 0);
    }
}

И тогда вы можете сделать что-то вроде:

int index1 = 0; //wherever bold should begin
int index2 = 5; //wherever bold should end

Spannable span = new SpannableString("some string");
span.setSpan(new StyleSpan(Typeface.BOLD),index1, index2,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

((CustomTextView)findViewById(R.id.yourTextView)).setText(span);

Ответ 4

Вы можете создать собственное представление и сделать свой текст двумя объектами Paint, используя метод canvas.drawText

Ответ 5

Я использовал этот подход:

class FooClass {
    void Foo() {
        textViewSetText(R.id.photo_title, "Title: ", photo.getTitle());
        textViewSetText(R.id.photo_tags, "Tags: ", photo.getTags());
        textViewSetText(R.id.photo_author, "Author: ", photo.getAuthor());
    }

    private void textViewSetText(int resourceId, String prefix, String text) {
        TextView textView = (TextView) findViewById(resourceId);
        SpannableString styledText = new SpannableString(prefix);
        styledText.setSpan(new StyleSpan(Typeface.BOLD), 0, prefix.length(), 0);
        textView.setText(null);
        textView.append(styledText);
        textView.append(text);
    }
}

Как вы можете видеть ниже, " Автор ", " Заголовок " и " Теги " установлены в полужирный:

Screenshot

Ответ 6

Пробовал ли вы настраивать пользовательский шрифт в TextView перед тем, как применить текст с возможностью использования spanable?

Typeface face = Typeface.createFromAsset(ctx.getAssets(), "fonts/boost.ttf")
TextView tv = (TextView) ctx.findViewById(id);
tv.setTypeface(face);

а затем примените SpannableStringBuilder как из связанного вопроса - я предполагаю, что если ваш ttf поддерживает "normal" и "bold", он будет соответственно отображать:)