跟着Google学Android —— 2.1 孩子再多 也要兼顾 —— 支持不同设备
2016-03-24 10:50
741 查看
安卓发展到现在,N previw都已经在路上了。市面上的安卓机也是成千上百万,你用你的Ice-cream Sandwich,我用我的marshmallow;你用你的7寸两手捧4K超大屏,我用我的4.5寸单手神器;You Speak English,我说普通话...谷歌孩子这么多,还是要兼顾下的,这样才能尽可能的占领更多客户嘛,所以我们的app要去尝试兼容不同大小、分辨率、语言、地区的设备。
所以,将app中的字符串抽出来放在strings.xml中是非常有意义的。
3166-1-alpha-2区域代码,区域代码前面固定添加一个小写的r)。更多信息可以参考谷歌Providing Resources。
什么限定符都不带的values文件夹是作为缺省的默认值使用的。
在AS的导航栏中右键点击res,选择New -> Android resource directory:
然后,在Resource type中选择values,可以看到AS其实已经帮我们整合好了可选的修饰词:
我们在Available qualifiers中选择Locale区域,之后搜索找到中文,接下来选择区域,这里我分两次分别选择了大陆和香港。
点击OK会即会生成新的value文件夹,大陆地区对应的是values-zh-rCN,香港对应的文件夹是values-zh-rHK。
接下来我又建立了一个values文件夹,区域选择的是日本,生成的是values-ja。
然后分别在这三个文件夹中建立strings.xml文件,加上缺省的values文件夹中的这个文件,我们总共有4个了。
接下来分别在各自的xml文件中写入与区域对应语言的字符串,对于同一个字符串名字,在不同xml文件中是一样的,区别只是他们的值(用百度翻译的日文,原谅我的无知):
当系统语言既不是中文(简体)、香港(繁体)也不是日语的时候,就是使用values文件夹下面的值进行缺省显示。
在源代码中引用字符串的格式是R.string.<string_name>,具体如下:
所以我们有必要在app中包含不同质量的资源,以优化在不同尺寸或分辨率的屏幕上显示时的效果。
四种主要的尺寸:small、normal、large、xlarge;
四种主要的分辨率:low(ldpi)、medium(mdpi)、high(hdpi)、extra high(xhdpi)。
不同布局资源和位图资源的放置方法和前面的区域语言类似,都是建立带不同限定符的layout和drawable文件夹。值得注意的是,屏幕的不同朝向(竖向、横向)也被认为是不同的屏幕尺寸,所以如果有需要,这部分的内容也是要进行优化的。
layout-land\文件夹建好后我们在其中添加一个与layout\文件夹下面的activity_main.xml名字一模一样的布局文件,唯一的区别就是将最外面的布局背景设置为橙色。
编译,真机运行,将屏幕从竖直变成水平,效果就出来了:
在原始的向量格式的资源中按如下尺寸比例生成上面这些图片资源:
1. xhdpi:2.0
2. hdpi:1.5
3. mdpi:1.0(基准)
4. ldpi:0.75
举个例子,如果你为xhdpi的设备提供的图片分辨率是200x200的,那么对应给hdpi的同一图片分辨率就应该是150x150,mdpi应该是100x100,ldpi为75x75。
对于文件存放的路径,也与前面相似,都是放在对应分辨率的drawable-<density>\路径下,例如,xhdpi的文件放在drawable-xhdpi\路径下。
另外值得注意的是,低分辨率(ldpi)的资源并不是一定需要的,因为系统会将hdpi的资源尺寸减半来适应低分辨率的屏幕。
图标设计方面可以参考,Iconography design guide。
为了在不同的Android版本中提供更好的特性和功能,我们可以在app中使用Android Support Library,它允许我们在旧的安卓版本上使用一些新版本中的API。
举个例子:
举个例子:
值得注意的是,在解析XML资源的时候,安卓会忽略当前设备不支持的XML属性,所以放心大胆地使用XML吧。
对界面使用安卓系统的主题,举例:
对界面使用自定义的主题(styles.xml),举例:
也可以对整个APP使用自定义的主题,同理:
更多关于创建和使用主题的信息,可以参考Styles and Themes。
支持不同语言
之前提到的不要把字符串hard code在代码里,好处就体现出来了:如果我们有一个字符串是hard code的,那么无论在什么设备上使用,它显示的都是一样的内容,而我们有可能希望在不同的情景下显示不同内容,例如用户的系统语言是英文,我们就显示英文;用户系统语言是中文繁体,我们就显示中文繁体。所以,将app中的字符串抽出来放在strings.xml中是非常有意义的。
创建区域路径及字符串文件
安卓系统会根据在运行时的设备区域设定来载入对应的资源。举个例子,比如说我们要支持香港中文(繁体)的显示,那么我们就需要在res路径下再建立一个values文件夹,命名是用values加连字号-加ISO语言代码(两字母的ISO 639-1语言代码,后面可选跟随两字母的ISO3166-1-alpha-2区域代码,区域代码前面固定添加一个小写的r)。更多信息可以参考谷歌Providing Resources。
什么限定符都不带的values文件夹是作为缺省的默认值使用的。
在AS的导航栏中右键点击res,选择New -> Android resource directory:
然后,在Resource type中选择values,可以看到AS其实已经帮我们整合好了可选的修饰词:
我们在Available qualifiers中选择Locale区域,之后搜索找到中文,接下来选择区域,这里我分两次分别选择了大陆和香港。
点击OK会即会生成新的value文件夹,大陆地区对应的是values-zh-rCN,香港对应的文件夹是values-zh-rHK。
接下来我又建立了一个values文件夹,区域选择的是日本,生成的是values-ja。
然后分别在这三个文件夹中建立strings.xml文件,加上缺省的values文件夹中的这个文件,我们总共有4个了。
接下来分别在各自的xml文件中写入与区域对应语言的字符串,对于同一个字符串名字,在不同xml文件中是一样的,区别只是他们的值(用百度翻译的日文,原谅我的无知):
// values\strings.xml <resources> <string name="app_name">Support Different Language</string> <string name="hello_world">Hello World!</string> <string name="send_btn">SEND</string> </resources> // values-zh-rCN\strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">支持不同语言</string> <string name="hello_world">你好!世界!</string> <string name="send_btn">发送</string> </resources> // values-zh-rHK\strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">支持不同語言</string> <string name="hello_world">你好!世界!我是香港繁體</string> <string name="send_btn">發送</string> </resources> // values-ja\strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">違う言葉を支持する</string> <string name="hello_world">こんにちは!世界!</string> <string name="send_btn">送信</string> </resources>编译,真机运行,将系统设置成不同的语言,可以看到:
当系统语言既不是中文(简体)、香港(繁体)也不是日语的时候,就是使用values文件夹下面的值进行缺省显示。
使用字符串资源
我们可以通过string标签中的name字段对这个字符串进行引用。在不同文件中所不同的是,写法可能不同:在源代码中引用字符串的格式是R.string.<string_name>,具体如下:
// 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文件中引用字符串的格式是@string/<string_name>,具体如下:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" />
支持不同屏幕
安卓使用如下两个主要的属性来对屏幕进行归类:尺寸和分辨率。所以我们有必要在app中包含不同质量的资源,以优化在不同尺寸或分辨率的屏幕上显示时的效果。
四种主要的尺寸:small、normal、large、xlarge;
四种主要的分辨率:low(ldpi)、medium(mdpi)、high(hdpi)、extra high(xhdpi)。
不同布局资源和位图资源的放置方法和前面的区域语言类似,都是建立带不同限定符的layout和drawable文件夹。值得注意的是,屏幕的不同朝向(竖向、横向)也被认为是不同的屏幕尺寸,所以如果有需要,这部分的内容也是要进行优化的。
创建不同的布局
与区域语言同理,在res上邮件选择New -> Android resource directory,然后在resource type中选择layout,限定符选择orientation中的land(由于本人没有屏幕差距较大的安卓设备,所以就以竖向横向为例了),也就是横向。layout-land\文件夹建好后我们在其中添加一个与layout\文件夹下面的activity_main.xml名字一模一样的布局文件,唯一的区别就是将最外面的布局背景设置为橙色。
编译,真机运行,将屏幕从竖直变成水平,效果就出来了:
创建不同位图
对于app中的位图资源,我们最好也能够提供如下四种分辨率:low、medium、high以及extra-high。这有助于提高我们在不同屏幕上的图像表现。在原始的向量格式的资源中按如下尺寸比例生成上面这些图片资源:
1. xhdpi:2.0
2. hdpi:1.5
3. mdpi:1.0(基准)
4. ldpi:0.75
举个例子,如果你为xhdpi的设备提供的图片分辨率是200x200的,那么对应给hdpi的同一图片分辨率就应该是150x150,mdpi应该是100x100,ldpi为75x75。
对于文件存放的路径,也与前面相似,都是放在对应分辨率的drawable-<density>\路径下,例如,xhdpi的文件放在drawable-xhdpi\路径下。
另外值得注意的是,低分辨率(ldpi)的资源并不是一定需要的,因为系统会将hdpi的资源尺寸减半来适应低分辨率的屏幕。
图标设计方面可以参考,Iconography design guide。
支持不同平台版本
新的安卓版本总是会给我们提供很多更新更精彩的API,Android Dashboard上面的平台版本也显示了Google Play Store中活动的设备不同版本所占的比例。为了在不同的Android版本中提供更好的特性和功能,我们可以在app中使用Android Support Library,它允许我们在旧的安卓版本上使用一些新版本中的API。
指明最小和目标API级别
AndroidManifest.xml文件中描述了app的最小API级别以及目标API级别(和我们创建项目时候的值是一致的),定义使用的是use-sdk这个标签。举个例子:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wenhe.supportdifferentlanguage" > <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="23" /> //... </manifest>
在运行时检查系统版本
安卓在Build常量类中为每个安卓版本都提供了一个唯一的代码。通过使用这些代码来进行判断,仅当当前系统API满足条件时才执行某些代码。举个例子:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView txtSDK = (TextView) findViewById(R.id.txtSDK); if(Build.VERSION.SDK_INT == Build.VERSION_CODES.M) { txtSDK.setText("Your System is the latest M"); } else { txtSDK.setText("Your System is not M"); } } }编译好之后分别在系统为6.0和4.2.2的两台设备上运行,效果如下:
值得注意的是,在解析XML资源的时候,安卓会忽略当前设备不支持的XML属性,所以放心大胆地使用XML吧。
使用平台的样式和主题
安卓系统内置有很多主题样式,我们可以在AndroidMainfest.xml中设置不同界面以及整个app的主题。对界面使用安卓系统的主题,举例:
<activity android:theme="@android:style/Theme.Translucent">
对界面使用自定义的主题(styles.xml),举例:
<activity android:theme="@style/CustomTheme">
也可以对整个APP使用自定义的主题,同理:
<application android:theme="@style/AppTheme" >
更多关于创建和使用主题的信息,可以参考Styles and Themes。
相关文章推荐
- Android Studio的导入开源框架的示例
- 使用Android Studio布局加载器异常的问题
- AndroidStudio 用过很好用的控件 android layout id converter
- android开发需要知道的
- Android中Handler Runnable与Thread的区别详解
- Android Studio 1.5+ 中混合调试Native和Java代码
- Android 安全退出应用程序
- Android 去除String字串空格
- android studio 实现代码混淆
- Android关于listview设置属性 android:listselector = "@null" 无效的问题
- android Activity详解
- [转]Android ANR 分析解决方法
- AndroidStudio实用技能(1)
- Android ANR异常及解决方法
- Android SQLite性能分析
- 自定义简单常用的RadioButton
- Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果
- Android - day three 四大组件之 广播(broadcast reciver)
- Android中的Parcelable接口和Serializable用法和区别
- Android递归删除文件和文件夹