阅读Android官方教程 Google Training 1.2 ------ Supporting Different Devices

阅读谷歌官方教程第一章 Getting Started


还是继续上次的学习,这次我看了第二小节 Supporting Different Devices。这次的内容和上次不同,很多是当初走马观花的学习过,但是没有很好地通过认识的一些知识。这里我将今天学到的东西进行梳理。


Supporting Different Devices

分别从支持不同的语言,屏幕尺寸和平台版本三个方面进行展开


Supporting Different Language

Create Locale Directories and String Files

先看一段官方的叙述

To add support for more languages, create additional values directories inside res/ that include a hyphen and the ISO language code at the end of the directory name. For example, values-es/ is the directory containing simple resources for the Locales with the language code “es”. Android loads the appropriate resources according to the locale settings of the device at run time.

意思是说,为了支持更多语言,在res/文件加下,额外创建通过连字符和在文件名末端的ISO(国际标准化组织)的语言代码组成的文件。比如说values-es/是包含了语言码为”es”的简单资源的文件夹,Android会根据运行时设备的本地设置来加载恰当的资源。

看起来比较绕,来结合一个例子理解一下

MyProject/
    res/
       values/
           strings.xml
       values-es/
           strings.xml
       values-fr/
           strings.xml

APP会根据系统设置的语言来自动加载对应的资源。比如说下面几个例子:

  • 当你的手机语言是英语时,English (default locale), /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>
  • 当你的手机语言是西班牙语时,Spanish, /values-es/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mi Aplicación</string>
    <string name="hello_world">Hola Mundo!</string>
</resources>
  • 当你的手机语言是法语时,French, /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>

根据我们要支持的不同语言,预先通过创建符合规则的value文件夹,在其中设置相关内容即可。


Use the String Resources

使用字符串资源内容比较简单,只是第一种用得比较少,我还是罗列一下

  • 在源代码中使用字符串
// Get a string resource from your app's Resources
String hello = getResources().getString(R.string.hello_world);

// Or supply a string resource to a method that requires a string
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);
  • 在XML文件中使用字符串
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

Supporting Different Screens

关于如何适应不同屏幕尺寸和像素密度的知识

先说明一点,这里的方法是Android3.2版本之前的,而现在已经引用了更加高级的方法,但是出于好奇,我还是看完了,顺便记录一下所学成果。

Android通过两个属性来对屏幕进行归类——尺寸和密度。你应该要考虑到你的APP将会被安装在不同屏幕的设备上,所以对于不同屏幕的设备,你必须要包括不同的可替换的资源去优化APP在不同尺寸和密度下的外观。

  • 4个广泛使用的尺寸 Size : small, normal, large, xlarge
  • 4个广泛使用的密度 Density : low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)

为了个用于不同屏幕的布局文件和图片分类声明,你必须要把这些可替代的资源放在不同的文件里面,和处理支持不同语言的做饭相似。

除此之外,屏幕的朝向(水平或是竖直)也被认为屏幕的不同种类,所以大多是APP应该修订它们的布局文件以达到优化用户体验的目的。


Create Different Layouts

为了优化不同屏幕的用户体验,你应该为每一个你想支持屏幕创建一个XML文件,每一个layout文件应该被保存在合适的资源目录下,用 - screen_size 作为文件名的后缀。举一个例子,一个适应大尺寸的布局文件应该被保存在 res/layout-large/ 下面。

这里引用一段官方的提醒,觉得很有道理。

Note: Android automatically scales your layout in order to properly fit the screen. Thus, your layouts for different screen sizes don’t need to worry about the absolute size of UI elements but instead focus on the layout structure that affects the user experience (such as the size or position of important views relative to sibling views).

意思是说Android会自动缩放你的布局文件去适当地填满屏幕,你的布局文件不应该过多地担心不同UI组件的绝对尺寸,而应该把注意力放在可能影响用户体验的布局结构上(比如,相邻view之间的大小和位置)。

举一个例子,如果项目包含一个默认的布局文件和一个为large准备布局文件,它的文件结构应该是向下面这样:

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

注意的是,它们的文件名必须是相同的,但是为了根据相应的屏幕大小提供最佳的UI体验,内容应该是不同的。在源代码还是和原来一样,只是多准备了一个布局文件罢了,源代码的用例还是如下所示:

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

加载哪个布局,Android会根据APP运行时设备的屏幕大小去自动加载适当的文件,就不用我们关心了,我们准备好资源即可。

官方教程还举了一个关于手机横向时布局文件结构的例子:

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

可以看到,系统没有为竖直特意指明,因为默认状态下,layout文件就是为竖直摆放时准备的,那对于特殊屏幕大小的横向布局文件又该如何呢?官方也给了很好的解释:

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

可以看到如果想在large设备上也为land情况准备布局文件,我们就要用large和land两个限定词对文件命名。

但是在Android3.2及以上版本已经有更加先进的方法让你来确定不同屏幕需要加载的资源,根据考虑了像素密度的最小宽度和高度,但上面讲的并没有涉及。(什么鬼。。。我还是贴一下官方原话吧,别误导了)

Note: Android 3.2 and above supports an advanced method of defining screen sizes that allows you to specify resources for screen sizes based on the minimum width and height in terms of density-independent pixels. This lesson does not cover this new technique.


Create Different Bitmaps

当然这一部分内容,官方教程也不是最新的。

为了UI体验的提升,你应该提供可以在不同像素密度(low, medium, high and extra-high)下可以缩放的位图资源,它能帮你实现在不同密度的设备上拥有良好的图片质量和外观这么一个目的。

  • xhdpi: 2.0
  • hdpi: 1.5
  • mdpi: 1.0 (baseline)
  • ldpi: 0.75

这就意味着,如果你在xhdpi的设备上放一个200x200的图片吧,你就该用相同的资源,但是尺寸分别是150x150 给 hdpi, 100x100 给 mdpi, and 75x75 给 ldpi。

好奇怪,为什么官方教程里面图片是放在drawable文件那得,那倒是版本太早?

MyProject
    res/
        drawable-xhdpi/
            awesomeimage.png
        drawable-hdpi/
            awesomeimage.png
        drawable-mdpi/
            awesomeimage.png
        drawable-ldpi/
            awesomeimage.png

系统也会和布局文件一样根据设备的情况去加载资源的,我们只要准备好资源就可以啦。

还有一个有趣的注意点,引用一下原文:

Note: Low-density (ldpi) resources aren’t always necessary. When you provide hdpi assets, the system scales them down by one half to properly fit ldpi screens.

意思是说,ldpi的文件不是总是必须要的,如果你提供了hdpi的资源,系统会自动缩放折半去适应ldpi的屏幕。


Supporting Different Platform Versions

噢,这个最迷了,我看了官方解释还是好迷,本渣只能引用原文了。

虽然Android的持续更新会给你的APP带来更好的API,但你应该继续持续老的Android版本,直到大部分设备更新了它们的版本。这一课就是教你如何利用最新的API,同时也兼顾老的Android版本。

根据大量不同设备访问Google Store,平台版本的控制板会被定期更新去显示最活跃的设备的Android版本,通常将你的APP的运行版本定位在最新版本,可以支持将近最活跃的设备的90%。


Specify Minimum and Target API Levels

这两个属性我们在 AndroidManifest.xml 文件里面可以看到。minSdkVersion 和 targetSdkVersion 这两个属性都在 元素里面,分别指的是你的APPP所能兼容的最低API等级和你意图和测试APP的最高API等级。比如这样:

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

随着Android版本不断发布,一些风格和行为可能会发改变,为了利用新版本的优势和确保你的APP能使用每个用户设备的风格,你应该将 targetSdkVersion 的值设置成可获得的最新的Android版本。


Check System Version at Runtime

在运行的时候检查系统版本。迷就迷在这里,因为完全没有接触过。先引用一下官方的原话。

Android provides a unique code for each platform version in the Build constants class. Use these codes within your app to build conditions that ensure the code that depends on higher API levels is executed only when those APIs are available on the system.

我看了看,大概意思是说,Android给每一个平台版本都提供一个独特的编码,放在Build的常量类文件里。在APP中用这么编码去形成条件—-确认 当这些API在系统上可以获得时,需要在更高API等级运行的代码才会被执行 的 条件。我觉得是这个意思。

这里官方又给出了一个有趣的注意点:

When parsing XML resources, Android ignores XML attributes that aren’t supported by the current device. So you can safely use XML attributes that are only supported by newer versions without worrying about older versions breaking when they encounter that code. For example, if you set the targetSdkVersion=”11”, your app includes the ActionBar by default on Android 3.0 and higher. To then add menu items to the action bar, you need to set android:showAsAction= “ifRoom” in your menu resource XML. It’s safe to do this in a cross-version XML file, because the older versions of Android simply ignore the showAsAction attribute .

大概意思就是说解析XML文件的时候,如果你是用高于设备运行的XML属性编写的XML文件,这些属性在低版本的设备上运行时将会被忽略,所以你可以安全的使用那些只被更好版本支持的XML属性,而不用担心旧版本设备运行时会产生错误。后面就。。。。。。


Use Platform Styles and Themes

使用平台的风格和主图,通常这都是可以在manifest文件里面设置的,如果你使用了系统自带的风格或是主题,随着Android新版本的发布,你的APP将会自然地跟随最新的主题外观。
这里简单地贴一些例子:

  • 让acticity变成对话框样式
<activity android:theme="@android:style/Theme.Dialog">
  • 让activity拥有透明的背景
<activity android:theme="@android:style/Theme.Translucent">
  • 在/res/values/styles.xml 文件下定义你自己的style,然后应用在activity
<activity android:theme="@style/CustomTheme">
  • 给APP力的所有activity应用样式,你只需要在 < application > 元素下增加 android:theme 属性
<application android:theme="@style/CustomTheme">

好了,今天就这么多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值