从XML获取自定义textview的自定义属性

时间:2014-08-30 14:06:46

标签: java android textview

如何获取自定义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 谢谢

3 个答案:

答案 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"