自定义Textview与Html文本和自定义字体整个Android应用程序

时间:2013-06-26 13:37:30

标签: android fonts textview

我创建了一个自定义textview来设置自定义字体并为整个应用程序设置html文本。因为我的应用程序在很多地方都有这两个功能。在这种情况下,我可以将自定义字体设置为整个Android应用程序,它工作得很好。但未能将html文本应用于自定义textview。

我有限制:

  1. 我不想获取textview并使用setText(Html.fromHtml("Some text"))。当我在代码中使用它时它正在工作但我想使用strings.xml中的文本作为<string name="my_app"><![CDATA[My Whole <b>app</b>lication]]></string>
  2. 我不能在自定义类函数中覆盖settext,因为它是最终方法。
  3. 我的html文本接近100.我不想在代码中对这些字符串进行硬编码。请帮忙。
  4. 我的自定义课程:

    public class CustomTextView extends TextView {
    
        public CustomTextView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }
    
        public CustomTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            // TODO Auto-generated constructor stub
        }
    
        public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub 
        }
    
        @Override
        public void setTypeface(Typeface tf) {
            // TODO Auto-generated method stub
            super.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/gothic.ttf"));
        }
    }
    

    我的布局文件:

    <com.views.CustomTextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/my_app" />
    

    我得到的输出为:我的应用程序

    我希望输出为:我的 app lication

    app以粗体显示

    有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

您是否考虑过使用SpannbleString? How can I use TypefaceSpan or StyleSpan with a custom Typeface?

Here是您可以在SpannableString上应用的不同跨度。

 public void setSpan(){
    Spannable spantext = new SpannableString("My application");


    spantext.setSpan(new StyleSpan(Typeface.BOLD), 3//Start of span, 6//End of span, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    Typeface HelveticaNeueBoldItalic = Typeface.createFromAsset(getActivity().getAssets(), "fonts/HelveticaNeueBoldItalic.ttf");
    spantext.setSpan(new CustomTypefaceSpan("", HelveticaNeueBoldItalic ), 0, text.lenght(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);



    TextView text;

    text.setText(spantext);
}






 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);
        }
    }