写点什么

Android- 适配各国语言、屏幕尺寸、系统版本及常见适配方法总结

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日

drawable-hdpi/awesomeimage.pngdrawable-mdpi/awesomeimage.pngdrawable-ldpi/awesomeimage.png


任何时候,当引用 @drawable/awesomeimage 时系统会根据屏幕的分辨率选择恰当的 bitmap。


另外,解释一下为什么上面表格有两行标位红色,原因是 2 倍图和 3 倍图是主流占比,在友盟统计中显示如下:



其次,说一说这个 XML 布局文件的适配。


实际开发时,我们在 xml 布局里设置控件的宽高属性都是以“dp”做为单位,甚至还会遇到横竖屏页面适配情况。前面提到了 Layout 适配尺寸有 4 种:小(small),普通(normal),大(large),超大(xLarge)


所以,我们可以在资源文件 Layout 根目录创建不同尺寸的目录,系统会根据 app 所运行的设备屏幕尺寸,在与之对应的 layout 目录中加载 layout。更多详见 Pr


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


oviding Resources。例如:


res/layout/main.xmllayout-large/main.xml


Xml 文件的名字相同。为不同屏幕做不同 UI 处理,内容不同。如平常一样在 APP 中引用:


@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}


*记得在 AndroidManifest.xml 文件中设置多分辨率支持:


<Supports-screensandroid:largeScreens="true"android:normalScreen="true"android:anyDensity="true"


android:smalleScreen="true"/>


最后,说一说横竖屏布局兼容的问题。


先看下面一个例子:这一个工程中适配横向屏幕的 layout-land


MyProject/res/layout/main.xmllayout-land/main.xml


默认的 layout/main.xml 文件用作竖屏的 layout。


如果想给横屏提供适配于大屏幕,那么则需要使用 large 和 land 修饰符。


MyProject/res/layout/ # default (portrait)main.xmllayout-land/ # landscapemain.xmllayout-large/ # large (portrait)main.xmllayout-large-land/ # large landscapemain.xml


其他屏幕适配方式:


###(1)页面控件属性常用适配方法 1.尽量使用线性布局(LinearLayout)和相对布局(RelateLayout),尽量不使用绝对布局(AbsoluteLayout)和帧布局(FrameLayout)。2.尽量使用 wrap_content、mach_parent 让 view 自适应或最大化,尽量不要写宽高的值。3.使用线下布局的百分比 weight 权重时,要把宽度写成“0dp“,如果写成 wrap_coent 会使布局效果不佳等问题。4.尽量使用 android 的 Shape 自定义 view 背景,这样会随之自适应。5.ImageView 的 ScaleType 有五种方式(center,centerCrop,centerInside,fieCenter,fieXY),尽量使用 fieCenter 按比例扩大至 view 宽度,能取得较好适配和显示效果。6.获取屏幕分辨率信息,进行动态适配:DisplayMetrics metrics =newDisplayMetrics();??getWindowManager().getDefaultDisplay().getMetrics(metrics);###(2)手机横竖屏切换兼容适配? ? ? ??我们会把屏幕设置成单一的横屏或竖屏,设置的方法是去 AndroidMaifest.xml 中把 activity 中的 android:screenOrintation 设置成 landscape 或者 portrait,这种单一的屏幕模式。如果设置成"sensor",就由物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换的时候需要注意布 局问题和重新载入问题。


·布局问题:在 res 目录先建立 layout-land 和 layout-port 目录相应的 xml 文件名字相同,然后在两个文件夹下创建相同名字的两套 xml,模拟器就会根据不同 的屏幕来进行自动寻找。也可以只在 layout 中创建 xml,通过 this.getResources().getConfiguration().orientation 来判断当前是横屏还是竖 屏,然后在 oncreate 方法中加载不同的布局**·重新载入问题:**如果不需要重新载入(重新走一遍 activity 的生命周期),则在 AndroidManifest.xml 中 activity 标签下设置 android: configChanges="orientation|keybordHidden",这样的话就不会重复调用 activity 的生命周期方法,切换时只会调用 onConfigChanged(Configuration newconfig)。如果需要重新载入,则不需要添加属性


###三、适配不同系统版本


新的 Android 版本会为我们的 app 提供更棒的 API,但我们的 app 仍应支持旧版本的 Android,直到更多的设备升级到新版本为止。


首先,在项目清单文件中指定最小和目标 API 级别。具体来说,<uses-sdk>元素中的 minSdkVersion 和 targetSdkVersion?属性,标明在设计和测试 app 时,最低兼容 API 的级别和最高适用的 API 级别(这个最高的级别是需要通过我们的测试的)。例如:


<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... ><uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />...</manifest>


其次,是在代码中判断检查版本信息。Android 在 Build 常量类中提供了对每一个版本的唯一代号,在我们的 app 中使用这些代号可以建立条件,保证依赖于高级别的 API 的代码,只会在这些 API 在当前系统中可用时,才会执行。


private void setUpActionBar() {// Make sure we're running on Honeycomb or higher to use ActionBar APIsif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {ActionBar actionBar = getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);}}


最后,使用项目的风格和主题跟随系统版本改变外观。Android 提供了用户体验主题,为 app 提供基础操作系统的外观和体验。这些主题可以在 manifest 文件中被应用于 app 中。通过使用内置的风格和主题,我们的 app 自然地随着 Android 新版本的发布,自动适配最新的外观和体验.


使 activity 看起来像对话框:


<activity android:theme="@android:style/Theme.Dialog">


使 activity 有一个透明背景:


<activity android:theme="@android:style/Theme.Translucent">


应用在/res/values/styles.xml 中定义的自定义主题:


<activity android:theme="@style/CustomTheme">


使整个 app 应用一个主题(全部 activities)在元素中添加 android:theme 属性:

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android-适配各国语言、屏幕尺寸、系统版本及常见适配方法总结