使用lib添加自定义字体android

时间:2014-11-03 20:34:26

标签: java android xml

我使用的是android自定义字体lib书法https://github.com/chrisjenx/Calligraphy

但是对textview没有任何影响。我使用以下代码:

    public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(new CalligraphyContextWrapper(newBase));
    }
}

在XML中:

<TextView
        tools:context=""
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Touch Listner"
        android:textSize="18sp"
        app:fontPath="fonts/gotham-book.ttf" />

在attrs:

<resources>
    <attr name="fontPath" format="string"/>
</resources>

在assets / font / gotham-book.ttf

7 个答案:

答案 0 :(得分:4)

TextView删除命名空间。

<TextView
    tools:context=""
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Touch Listner"
    android:textSize="18sp"
    fontPath="fonts/gotham-book.ttf" />

(将app:fontPath更改为fontPath

令人讨厌的是我们无法解析auto-res命名空间。

答案 1 :(得分:3)

创建现在扩展Application的类,并在其中包含以下代码。并在应用程序标记下的清单中声明它。

    CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                    .setDefaultFontPath("fonts/Roboto-ThinItalic.ttf")
                    .setFontAttrId(R.attr.fontPath)
                    .build()
    );

答案 2 :(得分:3)

创建扩展Application的类。 这样的事情:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                .setDefaultFontPath("fonts/DINNextLTPro-Regular.otf")
                .setFontAttrId(R.attr.fontPath)
                .build()
        );
    }

}

接下来我们需要做的是打开应用程序的AndroidManifest.xml文件,并在应用程序标记的MyApplication属性中添加对android:name的引用,以便最后清单文件看起来与此类似:

<?xml version="1.0" encoding="utf-8"?>
<manifest package="it.sbsmobile.golife"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:name="com.example.MyApplication">
        <activity
            android:name=".Profile1"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

另外,https://github.com/chrisjenx/Calligraphy上的说明通过覆盖活动中的方法来注入上下文,如下所示:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}

来源:LINK

为什么要扩展Application类? ANSWER

答案 3 :(得分:1)

1)下载并复制项目资产文件夹中的字体(yourfont.ttf)文件

2)在您的Activity / Fragment中使用以下代码加载字体

 Typeface yourfont = Typeface.createFromAsset(getAssets(),
            "fonts/yourfont.ttf");

3)找到TextView(或您要设置此字体的任何其他视图)并使用View的setTypeface方法。 例如。

TextView textview1 = (TextView) findViewById(R.id.exampletextview);
textview1.setTypeface(yourfont);

这当然有一个缺点,即如果你想要应用字体的视图很多,你可以为每个视图手动设置字体。在这种情况下,您可以通过扩展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() {
    Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/yourfont.ttf");
    setTypeface(tf ,1);

}

}

并在xml中将其用作<com.yourpackagename.MyTextView />

答案 4 :(得分:1)

我遇到了同样的问题。

在这里,你需要做两件事。

首先,在xml中,在布局根

中添加两行(如下所示)
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MissingPrefix"

最后,在Activity类中,

protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
    }

Yooooo,已经完成!!简单

Example please check http://i.stack.imgur.com/F87JE.png

答案 5 :(得分:0)

我使用了TypefaceTextView lib来获得您想要的结果。请看一下(https://github.com/ragunathjawahar/android-typeface-textview)。

答案 6 :(得分:0)

You can also use simple EasyFonts third party library to set variety of custom font to your TextView. By using this library you should not have to worry about downloading and adding fonts into the assets/fonts folder. Also about Typeface object creation.

Provided font faces. Which might you would like to use.

  • Roboto
  • Droid Serif
  • Droid Robot
  • Freedom
  • Fun Raiser
  • Android Nation
  • Green Avocado
  • Recognition

Simply:

TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(EasyFonts.robotoThin(this));