如何获取自定义fontname自定义TextView的属性以将字体设置为Textview。 基于属性值设置TextView中的字体
public class MyTextView extends TextView
{
public MyTextView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
}
public MyTextView(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
}
public MyTextView(Context context)
{
super(context);
init();
}
public void init()
{
// set font_name based on attribute value of textview in xml file
String font_name = "";
if (!isInEditMode())
{
Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
"fonts/"+font_name);
setTypeface(tf);
}
}
在Xml文件中
<com.Example.MyTextView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
fontname="font.ttf"
android:text="Header"
/>
我还将font.ttf文件放在assets-&gt; fonts 中 谢谢
答案 0 :(得分:5)
1。将readAttr(context,attrs)方法添加到您的构造函数中,如下所示。
public MyTextView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
readAttr(context,attrs);
init();
}
public MyTextView(Context context, AttributeSet attrs)
{
super(context, attrs);
readAttr(context,attrs)
init();
}
public MyTextView(Context context)
{
super(context);
init();
}
2。在同一个类中定义readAttr()方法。
private void readAttr(Context context, AttributeSet attrs) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyTextView);
// Read the title and set it if any
String fontName = a.getString(R.styleable.MyTextView_fontname) ;
if (fontName != null) {
// We have a attribute value and set it to proper value as you want
}
a.recycle();
}
3。修改attrs.xml文件(res / values / attrs.xml)并将以下内容添加到文件
<declare-styleable name="MyTextView">
<attr name="fontname" format="string" />
</declare-styleable>
4。在Xml文件中。
<com.Example.MyTextView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
custom:fontname="font.ttf"
android:text="Header" />
5。将此行添加到xml文件的顶部容器中。
xmlns:custom="http://schemas.android.com/apk/res/com.yourpackage.name"
多数人
答案 1 :(得分:3)
首先你要定义declarable-styleable
,它应该是这样的:
<declare-styleable name="MyTextView">
<attr name="fontname" format="string"/>
</declare-styleable>
在您的布局中,您可以访问&#34;这 attr ,但首先您必须定义namespace
:
xmlns:myPrefix="http://schemas.android.com/apk/res-auto"
注意: namespace
是任意的。因此,您也可以将其命名为xmlns:whatever
。
然后您可以设置 fontname ,如下所示:
<com.Example.MyTextView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
myPrefix:fontname="font.ttf"
android:text="Header"
/>
为了检索值,您必须在MyTextView
的构造函数中执行以下操作:
TypedArray values = context.obtainStyledAttributes(attrs, R.styleable.MyTextView);
String font = values.getString(R.styleable.MyTextView_fontname);
// set the typeface etc.
注意: MyTextView_fontname
这始终是以下划线分隔的组合。所以基本结构是 StyleableName _ AttrName
答案 2 :(得分:0)
首先将自定义字体添加到assets-&gt; fonts目录 Like this image
然后将此代码添加到attrs.xml文件值文件夹
<declare-styleable name="TextViewCustomFont">
<attr name="showText" format="boolean" />
<attr name="custom_font" format="enum">
<enum name="roboto_Regular" value="0"/>
<enum name="roboto_bold" value="1"/>
<enum name="roboto_medium" value="2"/>
</attr>
</declare-styleable>
现在添加这个扩展TextView的自定义类。一件事是默认值是机器人常规,它的默认值为0.所以当自定义:custom_font属性未设置时,a.getInteger(R.styleable.TextViewCustomFont_custom_font,0)返回0。
public class CustomFontTextView extends TextView {
public CustomFontTextView(Context context) {
super(context);
}
public CustomFontTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context,attrs);
}
public CustomFontTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
private void init(Context context, AttributeSet attrs) {
int fontFlag;
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.TextViewCustomFont,
0, 0);
try {
fontFlag = a.getInteger(R.styleable.TextViewCustomFont_custom_font, 0);
Log.v("fontFlag", fontFlag + "");
} finally {
a.recycle();
}
Typeface tf = null;
if (fontFlag == 0)
tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/Roboto-Regular.ttf");
else if (fontFlag == 1)
tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/Roboto-Bold.ttf");
else if (fontFlag == 2)
tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/Roboto-Medium.ttf");
setTypeface(tf);
}
}
现在在布局文件中使用此类
<com.example.tomal.CustomFontTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="@string/title"
your_choice:custom_font="roboto_medium"
/>
添加到父级布局的行
xmlns:your_choice="http://schemas.android.com/apk/res-auto"