Android 版本分裂始终是一个头疼的问题, 本月我们将用一种合理的方案,解决不同SDK, 不同版本下匹配的问题。 SDK实际上并不是向下兼容, 我们做产品的时候,是否意味着需要管理多个版本? 这样带来的成本,对于中小团队来说,是一场噩梦。 因此,我们寻求的解决方案是: 同一个版本, 应对多变的外部平台。

我们这边的需求是:

1. 不针对不同的分辨率开发多个版本. 不为Android平板开发新版本====》 目的,方便统一版本管理, 减少后期维护压力。

2. 图片一律不重新设计, 目标版本最佳为: 800 * 480, 避免用户的下载APK包过大. =====》为用户节省流量, 避免吓退用户。

3. 要求对2.2以后的SDK版本的各种分辨率进行适配. 其他版本美观要求可以略微降低, 但不影响客户使用。

因为我们不是游戏产品, 而是应用开发, 所以, 达到这些要求, 已经非常足够。

针对上述需求, 集中解决的问题是: 不同的Android设备, 需要定义view的大小, 以及字体大小. 再无其它. 因此在我们的产品中, 是这样解决问题的。

1. 针对字体. 定义出大、中、小 三种版式, 每种再细分为三种型号, 如下:

[java] view plain copy
  1. <resources>
  2. <dimenname="txsize_large_xxx">45px</dimen>
  3. <dimenname="txsize_large_xx">39px</dimen>
  4. <dimenname="txsize_large_x">33px</dimen>
  5. <dimenname="txsize_mid_xxx">30px</dimen>
  6. <dimenname="txsize_mid_xx">27px</dimen>
  7. <dimenname="txsize_mid_x">24px</dimen>
  8. <dimenname="txsize_small_xxx">21px</dimen>
  9. <dimenname="txsize_small_xx">18px</dimen>
  10. <dimenname="txsize_small_x">15px</dimen>

这九种字形大小, 基本上可以涵盖一个产品的基本字体, 如果您的项目可能还有更多字体, 可以再增加_xxxxx这样的型号.

2. 针对不同的view, 同样整理出大中小三种版式,每种再细分为三种型号.

[java] view plain copy
  1. <!--各种需要适配的宽度值-->
  2. <dimenname="view_large_xxx">160dip</dimen>
  3. <dimenname="view_large_xx">140dip</dimen>
  4. <dimenname="view_large_x">120dip</dimen>
  5. <dimenname="view_mid_xxx">100dip</dimen>
  6. <dimenname="view_mid_xx">90dip</dimen>
  7. <dimenname="view_mid_x">80dip</dimen>
  8. <dimenname="view_small_xxx">70dip</dimen>
  9. <dimenname="view_small_xx">60dip</dimen>
  10. <dimenname="view_small_x">50dip</dimen>

3. 上述是18种长度值, 基本上涵盖了一个产品的全部需求, 将其保存为一个String.xml, 见 附件内容

4.为不同的尺寸,建立values文件夹, 文件夹中, 适配该型号的字体或者view的大小string.xml文件


5. 在layout中使用view的大小

[java] view plain copy
  1. <LinearLayoutandroid:layout_width="fill_parent"android:gravity="center_horizontal|center_vertical"
  2. android:layout_height="fill_parent"android:background="#263e60"
  3. android:layout_weight="1"android:orientation="horizontal">
  4. <Buttonandroid:id="@+id/chat_near_me"android:layout_width="@dimen/view_mid_x"
  5. <spanstyle="color:rgb(255,0,0);">android:layout_height="@dimen/view_mid_x"</span>android:background="@drawable/chat_near_me_unsel"
  6. android:gravity="center_horizontal|center_vertical"style="@style/pub_pos_title_font"
  7. android:orientation="horizontal"/>
  8. </LinearLayout>

在字体style文件中使用字体大小:
[java] view plain copy
  1. <stylename="dialog_checkbox_txt_font">
  2. <itemname="android:textSize"><spanstyle="color:#ff0000;">@dimen/txsize_large_x</span></item>
  3. <itemname="android:textColor">#ffffffff</item>
  4. </style>
  5. <stylename="dialog_button_txt_login_font">
  6. <itemname="android:textSize"><spanstyle="color:#ff0000;">@dimen/txsize_large_x</span></item>
  7. <itemname="android:textColor">#ffffffff</item>
  8. </style>


6. AndroidMainfest.xml文件标注需要适配

[java] view plain copy
  1. <uses-permissionandroid:name="android.permission.RESTART_PACKAGES"/>
  2. <supports-screensandroid:largeScreens="true"android:normalScreens="true"android:anyDensity="true"/>
  3. </manifest>

一切OK!

BTW:

1. 为每个分辨率建立Layout-xxx*xxx的解决方案. 显然不好, 重复度太高, 维护代价大

2. 有人说仅仅通过dip解决方案, 说这样可以做到设备无关, 放弃吧, 这个绝对不行.

3. 推荐布局文件尽量手写, 别用工具生成, 另外, 注意多用LearLayout, 布局为fill_parent的方式, 这样非常好的将屏幕按照比例划分, 移植能力非常优越, 拿一个我写的为例:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <!--这是一个导航条:上一层,主页面,我的设备-->
  3. <LinearLayoutandroid:id="@+id/parent_layout"
  4. android:layout_width="fill_parent"android:layout_height="fill_parent"
  5. xmlns:android="http://schemas.android.com/apk/res/android"
  6. android:background="#ffffff"android:orientation="vertical">
  7. <LinearLayoutandroid:layout_width="fill_parent"
  8. android:layout_weight="15"android:layout_height="fill_parent"
  9. android:orientation="horizontal">
  10. <LinearLayoutandroid:layout_width="fill_parent"
  11. android:layout_weight="5"android:background="@drawable/bg_chat_msg_left"
  12. android:layout_height="fill_parent"android:orientation="horizontal">
  13. </LinearLayout>
  14. <!--最上层,模仿三个Tab的效果-->
  15. <LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center_horizontal|center_vertical"
  16. android:layout_weight="1"android:orientation="horizontal">
  17. <LinearLayoutandroid:layout_width="fill_parent"android:gravity="center_horizontal|center_vertical"
  18. android:layout_height="fill_parent"android:background="#263e60"
  19. android:layout_weight="1"android:orientation="horizontal">
  20. <Buttonandroid:id="@+id/chat_friend"android:layout_width="@dimen/view_mid_x"
  21. android:layout_height="@dimen/view_mid_x"android:background="@drawable/chat_friend_unsel"
  22. android:gravity="center_horizontal|center_vertical"style="@style/pub_pos_title_font"
  23. android:orientation="horizontal"/>
  24. </LinearLayout>
  25. <LinearLayoutandroid:layout_width="fill_parent"android:gravity="center_horizontal|center_vertical"
  26. android:layout_height="fill_parent"android:background="#263e60"
  27. android:layout_weight="1"android:orientation="horizontal">
  28. <Buttonandroid:id="@+id/chat_near_me"android:layout_width="@dimen/view_mid_x"
  29. android:layout_height="@dimen/view_mid_x"android:background="@drawable/chat_near_me_unsel"
  30. android:gravity="center_horizontal|center_vertical"style="@style/pub_pos_title_font"
  31. android:orientation="horizontal"/>
  32. </LinearLayout>
  33. <LinearLayoutandroid:layout_width="fill_parent"android:gravity="center_horizontal|center_vertical"
  34. android:layout_height="fill_parent"android:background="#263e60"
  35. android:layout_weight="1"android:orientation="horizontal">
  36. <Buttonandroid:id="@+id/chat_find"android:layout_width="@dimen/view_mid_x"
  37. android:layout_height="@dimen/view_mid_x"android:background="@drawable/chat_find_unsel"
  38. android:gravity="center_horizontal|center_vertical"style="@style/pub_pos_title_font"
  39. android:orientation="horizontal"/>
  40. </LinearLayout>
  41. <LinearLayoutandroid:layout_width="fill_parent"android:gravity="center_horizontal|center_vertical"
  42. android:layout_height="fill_parent"android:background="#263e60"
  43. android:layout_weight="1"android:orientation="horizontal">
  44. <Buttonandroid:id="@+id/chat_history"android:layout_width="@dimen/view_mid_x"
  45. android:layout_height="@dimen/view_mid_x"android:background="@drawable/chat_history_unsel"
  46. android:gravity="center_horizontal|center_vertical"style="@style/pub_pos_title_font"
  47. android:orientation="horizontal"/>
  48. </LinearLayout>
  49. </LinearLayout>
  50. <LinearLayoutandroid:layout_width="fill_parent"
  51. android:layout_weight="5"android:background="@drawable/bg_chat_msg_right"
  52. android:layout_height="fill_parent"android:orientation="horizontal">
  53. </LinearLayout>
  54. </LinearLayout>
  55. <!--特殊的中层,需要经常切换成Map或者List,以满足用户的不同设置模式-->
  56. <LinearLayoutandroid:layout_width="fill_parent"
  57. android:layout_weight="2"android:id="@+id/special_content"
  58. android:layout_height="fill_parent"android:orientation="horizontal">
  59. </LinearLayout>
  60. </LinearLayout>


这样,我们适配的时候,只需要将wrapper_content的内容, 由固定的view大小替换, fill_parent的内容, 完全不需要修改的.

附件是一个ui组织结构, 供参考注意没有将Layout内容打包,原因是, 只有一个layout文件夹

有一件诡异的事情公司的P7500升级后, 分辨率版本由原来的1280 * 800 变化为 1232 * 800 这个实在是有点诡异, 这个貌似是Android底层可配置的. 三星为什么这样做, 估计只有他自己晓得了。


更多相关文章

  1. Android(安卓)WebView漏洞
  2. [视频]Firefox for Android(安卓)预览版放出
  3. Android(安卓)Studio中调用高于minSdkVersion版本API, 无提示 (L
  4. Androids中的System.loadLibrary对于依赖so的加载分析
  5. Android引入外部自定义特殊字体的方法
  6. Android(安卓)Git 常用命令和规范
  7. Android系统字体规范与应用探索
  8. android 6.0的变化
  9. Android(安卓)targetSDK升级到28,gradle升级4.6遇到的问题

随机推荐

  1. 【读书笔记】【Android(安卓)开发艺术探
  2. 基于移动平台的多媒体框架——移植Live55
  3. Dagger2 在 Android(安卓)项目的正确使用
  4. Android(安卓)Memory Management, OutOfM
  5. 工程师淘金:开发Android主攻四大方向
  6. android进程和线程模型
  7. Android之如何判断定位是否开启及定位模
  8. Android是什么 之三-------手机之硬件形
  9. Android下添加新的自定义键值和按键处理
  10. 用ndk环境编译android可用的so库