前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 适配各国语言、屏幕尺寸、系统版本及常见适配方法总结

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

作者头像
Android技术干货分享
发布2019-03-27 11:21:39
1.2K0
发布2019-03-27 11:21:39
举报
文章被收录于专栏:Android技术分享Android技术分享

前言

全世界安卓智能手机语言不相同,由于各厂家生产出的系统、屏幕也各异,随着SDK不断更新不同版本也有区别,android适配技能日益成为必不可少的一项专业技能。根据网上的资料和个人经验总结,整理一份目前比较完整的适配大全,有疏漏之处还望指正。

一、适配国家语言

当用户在智能手机系统“设置”选项中更改了各国语言,这时我们需要在项目里通过资源目录实现适配语言。

我们知道工程的根目录有个res/的目录,res/下有一个资源类型的目录,其中有个values/strings.xml默认文件,在res/目录下创建多个values/strings.xml文件,但是values目录需要改名,例如:

代码语言:javascript
复制
res/
       values/
           strings.xml
       values-es/
           strings.xml
       values-fr/
           strings.xml

其中,英语,/values/strings.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">My Application</string>
    <string name="hello_world">Hello World!</string>
</resources>

西班牙语,/values-es/strings.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mi Aplicación</string>
    <string name="hello_world">Hola Mundo!</string>
</resources>

法语,/values-fr/strings.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mon Application</string>
    <string name="hello_world">Bonjour le monde !</string>
</resources>

然后,我们就可以在代码中使用R.string.<string_name>语法来引用字符串资源就行了。

二、屏幕适配

Android是用尺寸和分辨率这两种常规属性对设备加以分类。在我们开发项目中应该提供一些可选资源,针对尺寸和分别率来优化我们的界面外观。

·Layout适配有4种尺寸 :小(small),普通(normal),大(large),超大(xLarge) ·Bitmap适配有4种分辨率:低Low精度(ldpi), 中Middle精度(mdpi),高High精度(hdpi), 超高精度(xhdpi)

首先,说一说这个分别率的问题。

在项目开发的过程中有一个重要的合作是与UI设计师的图片大小分别率的沟通。例如,UI设计师实现步骤:①在coreldraw或者Sketch中制作好“矢量图标“ ;②保存输出为“PNG位图图片”,单位是px;③设置图标的内外边距,此时的边距单位是px;当开发者拿到图后,会遇到这样一个问题:内外边距是由px为单位的距离,但是在实际开发中“dp”做为单位的更加常见,所以就会涉及到“px”“dp”互转的问题。

对bitmap根据屏幕的分别率找到资源目录下的密度文件夹。参考下表:

image.png

比如,计算方式给xhdpi(2倍图,超高精度)级别的设备生成了一张200200px的图像,那么应该为hdpi生成150150px,为mdpi生成100100px, 为ldpi生成7575px的图片资源。然后,将这些文件放入相应的drawable资源目录中:

代码语言:javascript
复制
MyProject/
    res/
        drawable-xhdpi/
            awesomeimage.png
        drawable-hdpi/
            awesomeimage.png
        drawable-mdpi/
            awesomeimage.png
        drawable-ldpi/
            awesomeimage.png

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

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

image.png

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

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

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

代码语言:javascript
复制
res/
        layout/
            main.xml
        layout-large/
            main.xml

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

代码语言:javascript
复制
@Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
}

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

代码语言:javascript
复制
<Supports-screens
 android:largeScreens="true"
 android:normalScreen="true"
 android:anyDensity="true"  
 android:smalleScreen="true"/>

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

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

代码语言:javascript
复制
MyProject/
    res/
        layout/
            main.xml
        layout-land/
            main.xml

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

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

代码语言:javascript
复制
MyProject/
    res/
        layout/              # default (portrait)
            main.xml
        layout-land/         # landscape
            main.xml
        layout-large/        # large (portrait)
            main.xml
        layout-large-land/   # large landscape
            main.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级别(这个最高的级别是需要通过我们的测试的)。例如:

代码语言:javascript
复制
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
    ...
</manifest>

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

代码语言:javascript
复制
private void setUpActionBar() {
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

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

使activity看起来像对话框:

代码语言:javascript
复制
<activity android:theme="@android:style/Theme.Dialog">

使activity有一个透明背景:

代码语言:javascript
复制
<activity android:theme="@android:style/Theme.Translucent">

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

代码语言:javascript
复制
<activity android:theme="@style/CustomTheme">

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

代码语言:javascript
复制
<application android:theme="@style/CustomTheme">
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.03.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、适配国家语言
  • 二、屏幕适配
  • (1)页面控件属性常用适配方法
  • (2)手机横竖屏切换兼容适配
  • 三、适配不同系统版本
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档