前言
前段时间公司需要将项目(使用了Leanback)移植至Android4.0的机型上,由于Leanback官方文档中
说明该库需要基于4.2.4及以上的Android系统。所以,常规的路是走不下去的。
问题定位
最开始将Leanback库移植至Android4.0时,将所有高版本以上的API的调用都替换为了低版本API,如View.setBackground()等。以此解决了项目编译出错的问题。
项目出错搞定后,满心欢喜的将项目跑了起来。进入主界面,加载完数据后瞬间一片空白,没有展现预想的熟悉的界面。查看log信息发现应用无报错,但是就是界面不展示。对比了更改的Leanback库源码,除了低版本API的调用外,注意到一个地方我将原代码中getChildFragmentManager()改为了 getFragmentManager(),会不会是这块代码导致的呢?
试着改回原来的的代码,还原getChildFragmentManager()调用。修改后编译时报错,找不到该方法。将编译的SDK改为高版本SDK后编译通过,但运行时直接报错,找不到getChildFragmentManager()**方法。用低版本SDK无法编译通过,换高版本运行报错,这情况似乎无解。但是做android4.0的适配是必须要完成的,无解也得想办法搞。简单过了一遍源码,发现
Leanback库主要就是Fragment的嵌套,而getChildFragmentManager()是实现Fragment嵌套的关键。这个API在低版本的Fragment中是没有的,所以Leanback运行要求至少4.2.4上的Android操作系统。
解决问题
既然Leanback库不能在android4.0上运行是因为低版本的Fragment没有提供getChildFragmentManager(),使用系统的Fragment无法实现Leanback功能,那不用系统的Fragment不就可以了吗?由于Android提供了独立的Fragment库,找一个提供了getChildFragmentManager()对应的Fragment库似乎可以解决此问题。
于是,我下载了一个较高版本的Fragment库,引入到Leanback库中并对Leanback库源码进行修改。源码修改主要是将系统的Fragment(android.app.framgent包)中的类替换为support库对应的类。做完以上工作发现库没有编译报错,但主项目报错,主要是类型转换问题,无法将support库对应的类转换为系统Fragment对应的类。解决方法,替换主项目中系统Fragment中的类为support库对应的类。除此外,主项目中的FragmentActivity替换为suppport库对应的FragmentActivity,由于两个FragmentActivity中获取FragmentManager的方法不同还需要将getFramgentManager()方法替换为getSupportFragmentManager()。至此项目无编译报错,可正常编译。
编译完成后运行,等待数据加载完成,“呼”,熟悉的画面出来了,搞定!!!
总结
Leanback库适配Android4.0需要完成以下工作:
1.将高版本API替换为低版本API,如setBackground()方法替换为setBackgroundDrawable();
2.引入android.support.v4.fragment库至Leanback中,需注意使用高版本support库,至少需可以提供getChildFragmentManager()方法;
3.修改Leanback库中android.app.fragment相关类为support库对应的类;
4.修改主项目中相关android.ap.fragment相关类为support库对应的类;