首先是尺寸的适配,android平板和手机相比,由于pad的大屏特性,屏幕的尺寸和分辨率的差别就很明显,例如以下平板信息:
小米平板:4.4.4 densityDpi:320 size:1536x2048
华为平板:5.1.1 densityDpi:240 size:1200x1920
华为荣耀某平板:6.1 densityDpi:320 size:1200x1920
三星平板:6.0.1 densityDpi:320 size:1600x2560
同样的一套mdpi下的layout或者values放在上面华为荣耀平板和三星平板上显示差别就很大。下面是开发中关于设计的一些心得:
1. 开发中保持不增加布局层级的情况下采用百分比weight属性;针对不同尺寸的设备百分比缩放是体验最完美的,但由于实际开发中复杂界面如果采用百分比,无疑增加了层级复杂度,反而降低了性能,降低了可维护性和扩展性。
2. layout中使用的dp/sp值采用@dimen引用方式写进dimens.xml里面;为了方便采用多个values文件夹例如values-sw600dp,values-1280x720等针对特定屏幕适配。自然也可以采用layout-1280x720这样的来区分不同布局,但如果只是尺寸上的适配,无疑用dimens维护几套尺寸值是最容易的,还可以写个读写文件工具,修改一个values里的dimens文件后更新到所有的values文件;
3. 以上面的华为荣耀平板为例,采用sw(smallwidth)的方式进行适配,比较简单的计算方式,以mdpi(160)为标准,此平板的screenWidthDips = 1200/(320/160) = 600dp,所以values-sw600dp可以适配此平板(有的平板系统宽高是包含屏幕的虚拟按键的高度);
4. 为了苛求在不同尺寸平板上的体验,采用values-1200x1920,values-1600x2560这种方式,即为每个屏幕增加尺寸适配,工作量和效率来说不会影响太大,毕竟可以通过软件工具生成多套;
除了界面方面,平板开发上的模块化采用Fragment更多,以及Fragment嵌套Fragment:
5. Fragment中调用startActivityForResult,如果要在Fragment的onActivityResult里回调处理,那么不要采用getActivity().startActivityForResult方法,且宿主Activity如果重写了onActivityResult方法的,必须调用super.onActivityResult,否则Fragment的onActivityResult方法不会回调,这点可以从Activity的源码中看出来;
6. 嵌套在Fragment里的子Fragment的onActivityResult如果需要回调则要自己处理;
7. Fragment嵌套Fragment时,在Fragment里采用getChildFragmentManager()管理子Fragment,用法跟getSupportFragmentManager()一样;子Fragment之间的通信,可以采用事件总线方案进行解耦,例如Otto/EventBus,但可读性会下降,所以详细的注释还是必要的;
网友评论