Android兼容不同设备

我们都知道Android设备有着各种各样的大小和尺寸,为了能在各种Android平台上使用,我们的app需要兼容各种不同的设备类型。例如语言,屏幕尺寸,系统版本等重要的变量因素需要重点考虑。现在我就重要讨论语言,屏幕尺寸的适配问题。

1. 适配不同的语言
上一篇博客中我们介绍了Android项目结构,相信充满机制你一定注意到了res目录中的valus就是用来处理不同的国家语言的。比如values-es/ 是为语言代码为”es”的区域设置的简单的资源文件的目录。Android会在运行时根据设备的区域设置,加载相应的资源。
若决定支持某种语言,则需要创建资源子目录和字符串资源文件,例如:

       values/
           strings.xml
       values-es/
           strings.xml
       values-zh/
           strings.xml
       values-de/
           strings.xml

我们只需添加不同的语言到相应的文件下,Android系统运行时会根据当前用户的区域设置,使用相应的字符串资源。例如:
values/strings.xml:(系统默认语言)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">My Application</string>
    <string name="hello_world">Hello World!</string>
</resources>

values-fr/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mon Application</string>
    <string name="hello_world">Bonjour le monde !</string>
</resources>

相应的图片语言也可以做本地化版本,例如:
drawable-de-xhdpi
drawable-en-xhdpi
drawable-zh-xhdpi
把相应的图片资源放入对应文件夹即可,注意图片id必须一致。
2. 适配不同的屏幕
Android用尺寸和分辨率这两种常规属性对不同的设备屏幕加以分类。我们应该想到自己的app会被安装在各种屏幕尺寸和分辨率的设备中。这样,app中就应该包含一些可选资源,针对不同的屏幕尺寸和分辨率,来优化其外观。

有4种普遍尺寸:小(small),普通(normal),大(large),超大(xlarge)
4种普遍分辨率:低精度(ldpi), 中精度(mdpi), 高精度(hdpi), 超高精度(xhdpi)

声明针对不同屏幕所用的layout和bitmap,必须把这些可选资源放置在独立的目录中,这与适配不同语言时的做法类似。
为了针对不同的屏幕去优化用户体验,我们需要为每一种将要支持的屏幕尺寸创建唯一的XML文件。每一种layout需要保存在相应的资源目录中,目录以-为后缀命名。例如,对大尺寸屏幕(large screens),一个唯一的layout文件应该保存在res/layout-large/中。
layout-land:适配大屏幕的layout
layout-large:配横向屏幕的layout
layout-large-land:横屏并且大屏幕的layou
例如:

        layout/              # default (portrait)
            main.xml
        layout-land/         # landscape
            main.xml
        layout-large/        # large (portrait)
            main.xml
        layout-large-land/   # large landscape
            main.xml

注:layout文件的名字必须完全一样,为了对相应的屏幕尺寸提供最优的UI,文件的内容不同。
3. 适配不同的系统版本
我们可以在build.gradle中指定最小和目标API级别。具体来说,在build.gradle的android标签下defaultConfig标签中的minSdkVersion和targetSdkVersion 属性,标明在设计和测试app时,最低兼容API的级别和最高适用的API级别(这个最高的级别是需要通过我们的测试的)。例如:

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        applicationId "com.example.administrator.marsdemo"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

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

使activity看起来像对话框:

使activity有一个透明背景:

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

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

4. Android 状态栏和导航栏(兼容4.4)
Google在Android 4.4 之后加入状态栏着色以及空间利用的api,也就是说在4.4之前是没有该功能的,所以我们没必要考虑之前的系统兼容问题,但是4.4和5.0以及5.0+的状态栏着色也是有差别的。那么今天我就以Google出的Material Design设计规范来统一实现4.4以后的系统状态栏着色问题。
1.空间利用:
相关Flag注释:
1. SYSTEM_UI_FLAG_FULLSCREEN 全屏(隐藏状态栏)
2. SYSTEM_UI_FLAG_HIDE_NAVIGATION 隐藏导航栏(结合全屏Flag使用)
3. SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 主体布局可以利用导航栏空间
4. SYSTEM_UI_FLAG_LAYOUT_STABLE 主体布局可以利用状态栏空间
5. SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 全屏(配合3和4使用)
6. SYSTEM_UI_FLAG_IMMERSIVE_STICKY 真正的沉浸式模式
空间使用:
首先我们定义一个app样式主题同时适配4.4+、5.x、5.x+系统:

·res/values/styles.xml
    <resources>
        <style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <item name="colorPrimary">@color/primary</item>
            <item name="colorPrimaryDark">@color/primary_dark</item>
            <item name="colorAccent">#FF4081</item>
        </style>
        <style name="AppTheme" parent="@style/BaseAppTheme">
        </style>
    </resources>
·res/values-v19(如果没有该文件夹请新建)
<resources>
   <style name="AppTheme" parent="@style/BaseAppTheme">
         这个属性是4.4系统引入的,表示透明化状态栏
         <item name="android:windowTranslucentStatus">true</item>
    </style>
</resources>
具体可以参考这篇博客:http://blog.csdn.net/demokui/article/details/54603284

如果不考虑兼容5.0以下设备则可以这样设置
res/values-v21

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
   <!-- Customize your theme here. --> 
   <!--导航栏底色-->
   <itemname="colorPrimary">@color/accent_material_dark</item> 
   <!--状态栏底色--> 
   <itemname="colorPrimaryDark">@color/accent_material_light</item> 
    <!--导航栏上的标题颜色--> 
   <itemname="android:textColorPrimary">@android:color/black</item> 
   <!--Activity窗口的颜色--> 
   <itemname="android:windowBackground">@color/material_blue_grey_800</item> 
   <!--按钮选中或者点击获得焦点后的颜色--> 
   <itemname="colorAccent">#00ff00</item> 
   <!--和 colorAccent相反,正常状态下按钮的颜色--> 
   <itemname="colorControlNormal">#ff0000</item> 
   <!--Button按钮正常状态颜色--> 
   <itemname="colorButtonNormal">@color/accent_material_light</item> 
   <!--EditText 输入框中字体的颜色--> 
   <itemname="editTextColor">@android:color/white</item> </style>

相关属性说明
1.colorPrimary: Toolbar导航栏的底色。
2.colorPrimaryDark:状态栏的底色,注意这里只支持Android5.0以上的手机。
3.textColorPrimary:整个当前Activity的字体的默认颜色。
4.android:windowBackground:当前Activity的窗体颜色。
5.colorAccent:CheckBox,RadioButton,SwitchCompat等控件的点击选中颜色
6.colorControlNormal:CheckBox,RadioButton,SwitchCompat等默认状态的颜色。
7.colorButtonNormal:默认状态下Button按钮的颜色。
8.editTextColor:默认EditView输入框字体的颜色。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值