资源是指代码使用的附加文件和静态内容,例如位图、布局定义、界面字符串、动画说明等
应用资源概览
分组资源类型
您应将各类资源放入项目 res/ 目录的特定子目录中。res/ 目录包含所有资源
资源分组.png提供备用资源
对于不同的设备,使用不同的资源会给用户更好的体验。在运行时,Android 会检测当前设备配置并为应用加载合适的资源。在新建项目时,AndroidStudio 已经为我们创建好了默认资源,所以我们只需为应用适配特定类型的设备即可。
为某组资源配置特定的备用资源:
1)在 res/ 中创建以 <resources_name>-<config_qualifier> 形式命名的新目录。 例如:drawable-hdpi/
Android 支持若干配置限定符,您可以通过使用短划线分隔每个限定符,从而向一个目录名称添加多个限定符。如果对资源目录使用多个限定符,则必须按照表 2中所列顺序将其添加到目录名称中。⚠️ 须按顺序
⚠️ 限定符命名规则
1)可以为单组资源指定多个限定符,并使用短划线分
2)些限定符必须遵循表 2 中列出的顺序
3)不能嵌套备用资源目录。
4)值不区分大小写。
5)每种限定符类型仅支持一个值。
访问应用资源
在应用中提供资源后,您可通过引用其资源 ID 来应用该资源。所有资源 ID 都在您项目的 R 类中进行定义,该类由 aapt 工具自动生成。
xml 文件中:@资源类型(例如 string、drawable、style等等)/资源名称 例如 R.string.hello
代码中:R.资源类型(例如 string、drawable、style等等).资源名称 例如 R.string.hello
处理配置变更
某些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性,以及当用户启用多窗口模式时)。发生这种变化时,Android 会重启正在运行的
Activity
(先后调用onDestroy()
和onCreate()
)。重启行为旨在通过利用与新设备配置相匹配的备用资源来自动重新加载您的应用,从而帮助它适应新配置。
使用系统通过
onSaveInstanceState()
回调为您保存的Bundle
,则可能无法完全恢复 Activity 状态,因为该类并非用于携带大型对象(例如位图),并且其中的数据必须依次在主线程中进行序列化和反序列化,而这可能会消耗大量内存并降低配置变更的速度。在此情况下,您可通过使用ViewModel
对象来减轻重新初始化 Activity 的负担。
在设备配置(例如屏幕方向、键盘可用性等)发生该改变,当前运行的 Activity 会重启,对应的数据会丢失,处理方法:
备注:如果不涉及到数据问题,则不需要对应处理。
1)通过 onSaveInstanceState()
回调保存的Bundle,但是onSaveInstanceState()
不适用于存储大量数据,此时要用 ViewModel
对象来处理。当然数据少的情况用onSaveInstanceState()
是没有问题的。
- 不让系统处理,自己处理,当配置发生改变阻止 Activity 重启。实现方法 :
AndroidManifest.xml中
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
Activity中
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen,
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
本地化 也就是 应用国际化
选中res目录,右键 New --> Android Resource Directory ,如下图所示,点击绿框,
image.png在语言中选择应用所适配的语言,点击 OK 可生成对应的文件。例如选中 en, 则生成values-en 目录。
image.png在选择资源过程中,唯一优先于语言区域的限定符是 MCC(移动国家代码)和 MNC(移动网络代码)。
例如: 应用的 SIM 卡连接的是印度的移动网络 (MCC 404)。语言设置为印地语 (hi)。即使设备设置为印地语,Android 仍会从 res/values-mcc404/strings.xml(采用英语)加载。
对于需要翻译的字符串提供备注信息来提高翻译质量。
可考虑提供的上下文信息:
1)字符串的用途是什么?它会在何时呈现给用户?
2)在布局中的什么位置?
标记文本中不应该被翻译的部分(常见的示例包括 一段代码、某个值的占位符、特殊符号或名称):可以使用 <xliff:g> 占位符标记不应翻译的文本
<string name="countdown">
<xliff:g id="time" example="5 days">%1$s</xliff:g> until holiday
</string>
使用 Android Context 对象获取语言区域:
Locale primaryLocale = context.getResources().getConfiguration().getLocales().get(0);
String locale = primaryLocale.getDisplayName();
END!
整理文档是很简单的事情,把自己了解到的东西记录下来,加深记忆,在遇到问题时能够想到对应的解决办法即可,在不断磨练中才会成长。 致懒惰的自己
网友评论