在项目过程中遇到一个问题,用户要求改变launcher的HomeWidget字体,采用他们提供的自定义字体,但是由于widget的视图是由RemoteViews加载进来的,而RemoteViews不提供方法可以获取到组件的实例,也没有方法可以设置对应组件的字体属性,因此需要另外想办法。
fontfamily属性
android系统内置了一些字体,可以在程序中使用,也可以在xml配置时进行修改,支持字段为textStyle;typeface;fontFamily。
系统内置了三种style: normal;bold;italic
系统内置了几种字体:serif;casual;cursive;monospace;sans-serif等,他们都是系统自带的Roboto font families
typeface和fontfamily的功能是一样的。在xml中设置typeface只能设置系统自带的。
设置自定义字体一般方法
在assets/fonts目录下放置.ttf文件
在程序中代码设置对应字体
AssetManager mgr=getAssets();//得到AssetManager
Typeface tf=Typeface.createFromAsset(mgr, "fonts/ttf.ttf");//根据路径得到Typeface
tv=findViewById(R.id.textview);
tv.setTypeface(tf);//设置字体
但是由于我在代码中拿不到组件实例,因此也没有办法直接设置,因此只能换另一种思路。
另外一种实现需求的方法
将自定义字体文件重命名,改成系统中已有的不常用的字体文件名,然后覆盖测试机系统中system/fonts目录下的对应字体文件。
在xml中直接设置fontfamily属性为我们替换的字体对对应的属性,运行程序即可
缺点是会删除系统中原来的字体。
如果需要将字体整体添加的话,还需要修改对应的字体相关API,重新编译SDK,那么久可以通过xml进行设置了。
相关链接: