android-settings添加字体更换-后篇-FontManger的apk实现

本文介绍了在Android中如何实现字体更换功能,包括扫描ttf文件或apk内嵌字体,利用PacketManager查找字体资源,以及处理UI更新和异常处理的问题。用户可以选择字体,并通过Market获取更多字体。在实现过程中,面临UI延迟、重启活动导致闪屏和异常处理等挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在写后篇的时候,一个周末已经过去了,代码什么的忘了个一干二净,不过我也没想过要贴源码,那么就开始吧。

因为是用户可选择的字体,为了后期可扩展,我们考虑用户可以自己下FontStyle,那么存在两种可能了,一是下ttf文件,而是包装了ttf文件的apk,如果是ttf文件造成的问题可能就是,不便于管理,你可能将ttf文件放到任何地方,影响加载,也不够稳定,使用apk,我们设置这些apk的包名的前缀是特定的,那么我们加载字体时,根据包管理器(packetManager)来获取特定前缀的包,根据其ttf资源获取其路径,来确定唯一的字体资源,在TextView加载字体时,再根据FontPakName和FontPath来加载资源。

需要注意的是,我们主要的功能用例:扫描字体文件,选择字体文件,从Maket获取其他字体。

1、扫描所有字体文件,开始已经说了,借助PacketManager获得特定模式的包。

2、更新系统字体,选择确定后,判断字体属性是否改变,设置新的Configuration,调用AMS的更新配置函数。

try {
            mCurConfig.fontPacName&fontPath ;
            ActivityManagerNative.getDefault().updatePersistentConfiguration(mCurConfig);
        } catch (RemoteException e) {
            Log.w(TAG, "Unable to update font style");
        }


3、Market获取新字体,这个很简单,startActivity就OK了。

			public void onClick(View v) {
				// TODO Auto-generated method stub
				try {
					Intent intent = new Intent(Intent.ACTION_VIEW, 
							Uri.parse("market://search?q=font"));
					startActivity(intent);
				} catch (ActivityNotFoundException e) {
					// TODO: handle exception
					String mems = "获取Market失败,请检查是否安装";
					Toast.makeText(MainActivity.this, mems, Toast.LENGTH_LONG).show();
				}
			}


功能很简单,却容易出现一些问题:

比如UI更新问题,字体的加载和更新过程都有1-2秒的延迟,字体加载可以用AsynTask,主线程用ProgressDialog来显示,而字体更新过程,至今没有想到好的方法,有一点点想法,都需要复杂的实现,问题是这样的,UpdateConfig的过程中,会重启AMS中ActivityStack的Activity,那么在这个过程中,会出现由于重启窗口的闪一下的问题。还望大家提供一些想法。

比如异常处理,获取Market的过程中,如果没有安装GooglePlay和类似的软件会出现强制退出的问题。调用AMS属于跨进程的调用,remoteException等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值