Fork me on GitHub
文章目录
  1. 1. 前言
  2. 2. 使用自定义字体
  3. 3. 解决问题
  4. 4. 最后,运行截图
  5. 5. 参考
  6. 6. 感谢

前言


最近在开发一款APP(其实是学习中),想要在一个页面中使用自定义字体。在使用过程中遇到了一些坑,特在此分享。我使用的是Android Studio 1.4, Win7

使用自定义字体

  1. 首先下载好想要的字体文件example.ttf
  2. 将其拷贝到项目Module下面的assets/fonts/example.ttf下面,先创建该文件夹,如下图所示:
    assets/fonts/example.ttf

  3. 对你想要定制字体的控件进行字体设置:

1
2
3
4
5
Typeface type= Typeface.createFromAsset(getAssets(),"fonts/example.ttf");

et_note = (EditText) findViewById(R.id.et_note);

et_note.setTypeface(type);

此处只是举例,具体可根据自己需要。
但是此时运行项目,会出现RuntimeException:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
AndroidRuntime: FATAL EXCEPTION: main
AndroidRuntime: java.lang.RuntimeException: native typeface cannot be made
AndroidRuntime: at android.graphics.Typeface.<init>(Typeface.java:175)
AndroidRuntime: at android.graphics.Typeface.createFromAsset(Typeface.java:149)
AndroidRuntime: at com.yongf.googleplay.holder.SubjectHolder.refreshHolderView(SubjectHolder.java:54)
AndroidRuntime: at com.yongf.googleplay.holder.SubjectHolder.refreshHolderView(SubjectHolder.java:35)
AndroidRuntime: at com.yongf.googleplay.base.BaseHolder.setDataAndRefreshHolderView(BaseHolder.java:58)
AndroidRuntime: at com.yongf.googleplay.base.SuperBaseAdapter.getView(SuperBaseAdapter.java:132)
AndroidRuntime: at android.widget.AbsListView.obtainView(AbsListView.java:2267)
AndroidRuntime: at android.widget.ListView.makeAndAddView(ListView.java:1769)
AndroidRuntime: at android.widget.ListView.fillDown(ListView.java:672)
AndroidRuntime: at android.widget.ListView.fillFromTop(ListView.java:733)
AndroidRuntime: at android.widget.ListView.layoutChildren(ListView.java:1622)
AndroidRuntime: at android.widget.AbsListView.onLayout(AbsListView.java:2102)
AndroidRuntime: at android.view.View.layout(View.java:13754)
AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4362)
AndroidRuntime: at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
AndroidRuntime: at android.view.View.layout(View.java:13754)
AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4362)
AndroidRuntime: at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1627)
AndroidRuntime: at android.view.View.layout(View.java:13754)
AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4362)
AndroidRuntime: at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
AndroidRuntime: at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
AndroidRuntime: at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
AndroidRuntime: at android.view.View.layout(View.java:13754)
AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4362)
AndroidRuntime: at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1043)
AndroidRuntime: at android.view.View.layout(View.java:13754)
AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4362)
AndroidRuntime: at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
AndroidRuntime: at android.view.View.layout(View.java:13754)
AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4362)
AndroidRuntime: at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:435)
AndroidRuntime: at android.view.View.layout(View.java:13754)
AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4362)
AndroidRuntime: at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
AndroidRuntime: at android.view.View.layout(View.java:13754)
AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4362)
AndroidRuntime: at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
AndroidRuntime: at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
AndroidRuntime: at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
AndroidRuntime: at android.view.View.layout(View.java:13754)
AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4362)
AndroidRuntime: at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
AndroidRuntime: at android.view.View.layout(View.java:13754)
AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:4362)
AndroidRuntime: at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1866)
AndroidRuntime: at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1687)
AndroidRuntime: at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
AndroidRuntime: at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:555)
AndroidRuntime: at android.view.Choreographer.doFrame(Choreographer.java:525)
AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:615)
AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:92)
AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:4745)
AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)

04-11 17:57:40.400 10374-10374/com.yongf.googleplay E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)

解决问题


至于为什么,没有搞清楚,看StackOverflow那帮人好像说是Android的一个八阿哥 @_@ (PS:如果你清楚,不要吝啬你的才华,留下言呗)。
下面是我的解决方案(针对Android Studio用户):
在模块的build.gradle中,添加(和defaultConfig同级):

1
2
3
4
5
sourceSets {
main {
assets.srcDirs = ['assets']
}
}

编译运行,OK!

最后,运行截图

成功啦!

参考


StackOverflow:http://stackoverflow.com/questions/12766930/native-typeface-cannot-be-made-only-for-some-people

感谢

感谢访问我的个人博客的朋友,如果您感觉本站对您搜索的问题有所帮助,并感觉对本站还满意的话,顶一下吧,希望您把本站分享给您的朋友!在此对您表示由衷的谢意! :)