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

我们这边的需求是:

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

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

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

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

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

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

<resources>  <dimen name="txsize_large_xxx">45px</dimen>  <dimen name="txsize_large_xx">39px</dimen>  <dimen name="txsize_large_x">33px</dimen>    <dimen name="txsize_mid_xxx">30px</dimen>  <dimen name="txsize_mid_xx">27px</dimen>  <dimen name="txsize_mid_x">24px</dimen>    <dimen name="txsize_small_xxx">21px</dimen>  <dimen name="txsize_small_xx">18px</dimen>  <dimen name="txsize_small_x">15px</dimen>

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

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

   <!-- 各种需要适配的宽度值 -->  <dimen name="view_large_xxx">160dip</dimen>  <dimen name="view_large_xx">140dip</dimen>  <dimen name="view_large_x">120dip</dimen>    <dimen name="view_mid_xxx">100dip</dimen>  <dimen name="view_mid_xx">90dip</dimen>  <dimen name="view_mid_x">80dip</dimen>    <dimen name="view_small_xxx">70dip</dimen>  <dimen name="view_small_xx">60dip</dimen>  <dimen name="view_small_x">50dip</dimen>

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

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

Android 多平台解决方案_第1张图片

5. 在layout中使用view的大小

<LinearLayout android:layout_width="fill_parent" android:gravity="center_horizontal|center_vertical"android:layout_height="fill_parent" android:background="#263e60"android:layout_weight="1" android:orientation="horizontal"><Button android:id="@+id/chat_near_me" android:layout_width="@dimen/view_mid_x"android:layout_height="@dimen/view_mid_x" android:background="@drawable/chat_near_me_unsel"android:gravity="center_horizontal|center_vertical" style="@style/pub_pos_title_font"android:orientation="horizontal" /></LinearLayout>

在字体style文件中使用字体大小:

<style name="dialog_checkbox_txt_font"><item name="android:textSize">@dimen/txsize_large_x</item><item name="android:textColor">#ffffffff</item></style><style name="dialog_button_txt_login_font"><item name="android:textSize">@dimen/txsize_large_x</item><item name="android:textColor">#ffffffff</item></style>


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

<uses-permission android:name="android.permission.RESTART_PACKAGES" /><supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity = "true"/></manifest>

一切OK!

BTW:

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

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

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

<?xml version="1.0" encoding="utf-8"?><!-- 这是一个导航条: 上一层, 主页面, 我的设备 --><LinearLayout android:id="@+id/parent_layout"android:layout_width="fill_parent" android:layout_height="fill_parent"xmlns:android="http://schemas.android.com/apk/res/android"android:background="#ffffff" android:orientation="vertical"><LinearLayout android:layout_width="fill_parent"android:layout_weight="15" android:layout_height="fill_parent"android:orientation="horizontal"><LinearLayout android:layout_width="fill_parent"android:layout_weight="5" android:background="@drawable/bg_chat_msg_left"android:layout_height="fill_parent" android:orientation="horizontal"></LinearLayout><!-- 最上层 , 模仿三个Tab的效果 --><LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal|center_vertical"android:layout_weight="1" android:orientation="horizontal"><LinearLayout android:layout_width="fill_parent" android:gravity="center_horizontal|center_vertical"android:layout_height="fill_parent" android:background="#263e60"android:layout_weight="1" android:orientation="horizontal"><Button android:id="@+id/chat_friend" android:layout_width="@dimen/view_mid_x"android:layout_height="@dimen/view_mid_x" android:background="@drawable/chat_friend_unsel"android:gravity="center_horizontal|center_vertical" style="@style/pub_pos_title_font"android:orientation="horizontal" /></LinearLayout><LinearLayout android:layout_width="fill_parent" android:gravity="center_horizontal|center_vertical"android:layout_height="fill_parent" android:background="#263e60"android:layout_weight="1" android:orientation="horizontal"><Button android:id="@+id/chat_near_me" android:layout_width="@dimen/view_mid_x"android:layout_height="@dimen/view_mid_x" android:background="@drawable/chat_near_me_unsel"android:gravity="center_horizontal|center_vertical" style="@style/pub_pos_title_font"android:orientation="horizontal" /></LinearLayout><LinearLayout android:layout_width="fill_parent" android:gravity="center_horizontal|center_vertical"android:layout_height="fill_parent" android:background="#263e60"android:layout_weight="1" android:orientation="horizontal"><Button android:id="@+id/chat_find" android:layout_width="@dimen/view_mid_x"android:layout_height="@dimen/view_mid_x" android:background="@drawable/chat_find_unsel"android:gravity="center_horizontal|center_vertical" style="@style/pub_pos_title_font"android:orientation="horizontal" /></LinearLayout><LinearLayout android:layout_width="fill_parent" android:gravity="center_horizontal|center_vertical"android:layout_height="fill_parent" android:background="#263e60"android:layout_weight="1" android:orientation="horizontal"><Button android:id="@+id/chat_history" android:layout_width="@dimen/view_mid_x"android:layout_height="@dimen/view_mid_x" android:background="@drawable/chat_history_unsel"android:gravity="center_horizontal|center_vertical" style="@style/pub_pos_title_font"android:orientation="horizontal" /></LinearLayout></LinearLayout><LinearLayout android:layout_width="fill_parent"android:layout_weight="5" android:background="@drawable/bg_chat_msg_right"android:layout_height="fill_parent" android:orientation="horizontal"></LinearLayout></LinearLayout><!-- 特殊的中层 , 需要经常切换成Map或者List, 以满足用户的不同设置模式 --><LinearLayout android:layout_width="fill_parent"android:layout_weight="2" android:id="@+id/special_content"android:layout_height="fill_parent" android:orientation="horizontal"></LinearLayout></LinearLayout>


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

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

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


更多相关文章

  1. cocos2dx 2.0版本在android下的安装配置问题
  2. 【转】Android -- 探究Android的多分辨率支持以及各种类型图标尺
  3. android如何统一aar/jar/moudle中引用依赖库版本不一致的问题
  4. Android 轻松实现后台搭建+APP版本更新
  5. Android百度地图——SDK版本v2.0.0初探
  6. 浅析Android字体加载原理
  7. Android SDK 版本的简称
  8. android Activity 设置大小

随机推荐

  1. Gradle in Android Studio: Failed to re
  2. 使用GDB调试Android 4.0中的WebKit
  3. Android系统Home应用程序(Launcher)的启动
  4. Android下实现一个手机监控摄像头
  5. 两分钟彻底让你明白Android Activity生命
  6. 一步步教你用Android Google Map
  7. android两种方式实现发送短信的功能代码
  8. Android Wear 控件——WearableListView(
  9. Android 进阶——Android Studio 项目结
  10. [置顶] Android(安卓)Gallery橱窗效果