[英]Custom font not getting applied
My Custom Font class 我的自定义字体类
public class CustomFontText extends TextView {
/*
* Caches typefaces based on their file path and name, so that they don't have to be created every time when they are referenced.
*/
private static Typeface mTypeface;
public CustomFontText(final Context context) {
super(context, null);
}
public CustomFontText(final Context context, final AttributeSet attrs) {
super(context, attrs, 0);
readAttrs(context, attrs);
}
public CustomFontText(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
readAttrs(context, attrs);
}
private void readAttrs(Context context, AttributeSet attrs) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomTextView);
// Read the title and set it if any
String fontName = a.getString(R.styleable.CustomTextView_fontname);
if (fontName != null) {
// We have a attribute value
if (mTypeface == null) {
mTypeface = Typeface.createFromAsset(context.getAssets(), fontName);
setTypeface(mTypeface);
}
}
// a.recycle();
}
}
Applying in XMl file 在XMl文件中应用
<somepackage.CustomFontText
android:id="@+id/details"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ewfewfewqfewfwef"
custom:fontname="Roboto-Regular.ttf" />
It is not giving any kind of error but I am not able to view any changes in the textview. 它没有给出任何类型的错误,但是我无法在textview中查看任何更改。 Changing the fontname makes no difference.
更改字体名称没有区别。
Moving the code setTypeface(mTypeface);
移动代码
setTypeface(mTypeface);
outside the check for mTypeface == null
should solve the issue. 在检查
mTypeface == null
应该可以解决此问题。 So the code should look like this: 因此,代码应如下所示:
if (mTypeface == null) {
mTypeface = Typeface.createFromAsset(context.getAssets(), fontName);
}
setTypeface(mTypeface);
This is because mTypeface
is declared static
and such all CustomFontText
instances share the same typeface (which makes sense for caching). 这是因为
mTypeface
被声明为static
并且所有CustomFontText
实例都共享同一字体(这对于缓存很有意义)。 If setTypeface
is called inside the check though, it will only get applied once, when the typeface is first loaded. 但是,如果在检查中调用
setTypeface
则在首次加载字体时,它将仅应用一次。
Actually I don't know why yours not working, however, alternatively you can use Calligraphy by chrisjenx . 实际上,我不知道您为什么不工作,但是,也可以使用chrisjenx的Calligraphy 。 I used it in one of my projects and it works great!
我在我的一个项目中使用了它,效果很好!
在项目的资产文件夹中创建文件夹字体 ,而不是仅使用字体名称作为custom:fontname ,而是使用文件的路径。
custom:fontname="fonts/Roboto-Regular.ttf"
Add ttf or otf file in your assets folder. 在您的资产文件夹中添加ttf或otf文件。
Create custom class extends with TextView 使用TextView创建自定义类扩展
public class CustomText extends TextView {
public CustomText (Context context) {
super(context);
createTextView(context, null);
}
public CustomEditText(Context context, AttributeSet attrs) {
super(context, attrs);
createTextView(context, attrs);
}
public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
createTextView(context, null);
}
private void createTextView(Context context, AttributeSet attrs) {
String fontName;
TypedArray typedArray;
if (isInEditMode())
return;
if (attrs != null) {
typedArray = context.obtainStyledAttributes(attrs, R.styleable.FontTypeFace, 0, 0);
fontName = typedArray.getString(R.styleable.FontTypeFace_typeface);
setFontTypeFace(context, fontName);
typedArray.recycle();
}
}
private void setFontTypeFace(Context context, String fontName) {
if (fontName != null) {
Typeface typeface = Typeface.createFromAsset(context.getAssets(), fontName);
setTypeface(typeface);
}
}
}
declare stylable in your attrs file : 在attrs文件中声明样式:
<declare-styleable name="FontTypeFace">
<attr name="typeface" format="string" />
</declare-styleable>
Create control using custom textview in xml file : 使用xml文件中的自定义textview创建控件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="horizontal"
android:weightSum="1">
<com.Widget.CustomTextView
android:id="@+id/txt_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/dimen_text_size_12"
app:typeface="@string/thin" />
</LinearLayout>
Just add the assets file name inside string.xml file 只需在string.xml文件中添加资产文件名
<!--String for assets font type file name -->
<string name="bold">bold.otf</string>
<string name="light">light.otf</string>
<string name="medium">medium.otf</string>
<string name="regular">regular.otf</string>
<string name="regular_italic">regular_italic.otf</string>
<string name="semi_bold">semibold.otf</string>
<string name="thin">thin.otf</string>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.