最近一段时间在国际部门做Android开发,所以手头的项目都需要去适配多语言。这里总结了一些多语言适配的经验。
然后得到多种语言适配string文件:
最后,设置多语言,在application的onCreate方法中调用 LanguageHelpergetAttachBaseContext(this),获取系统语言,通过Configuration来进行设置。
这里在实际适配阿拉伯语言的时候,需要注意一些问题,比如阿拉伯人是从右往左的,布局需要换成从右往左,所以在写布局时,以往用的left、right相关属性,都需要改为start、end相关的属性来写,布局自动会改为从右往左。而且有的带有方向性的也要有左右两个类型,甚至某些布局改变会出乱,需要进行判断当前是否为阿拉伯语种,来特殊布局处理。
这篇文章只针对后台返回的数据, 本地数据除外
我们发送网络请求的时候, 带一个语言类型参数, 例如 mapput("language", "ZH"), 我们需要什么语言就传什么语言类型, 正常接收返回值就可以了
这样做的好处:
① 对于android端, 新增、修改、删除语言 时也只需改变一个字段的值即可, 这个字段可以使用接口来控制值, App完全可以不用任何修改, 灵活性较高
② 对于整个项目而言: 前端("android", "IOS", "小程序", "公众号") 等多个端, 完全无需做任何判断, 只需后台处理好即可, 总体可以节约不少时间
后台把所有的语言数据一起返回 , 可能出现如下格式:
同行的人看到了肯定会说: 叫后台改成第一种方式啊
如果是项目刚刚开始开发, 可能比较好改
我碰到的情况是: 一开始项目没有做android端, 后台和web端已经上线了不知道多少个版本了, 反正就是后台架构已经确定了, 这个时候改成本会比较大 只能自己处理了
这个时候处理方式:
① 如果按照原来的方式: GsonFormat如下图:
这样是可以解析出来的, 看起来项目也能正常运行, 但是每个接口都这么做的话, 维护起来难度太大了, 项目越大越难维护 , 例如:新增一种语言, 竟然要全局大改 有100个接口就要改100个实体类, 等等
② 特殊处理
思考: 有什么办法可以和第一种方式一样, 修改一个参数就可以全局改变语言
观察: 共同点: 多语言的实体类里面都会有 变量名为"ZH" "EN" 的对象 , 对象不确定类型, 这个时候想到用泛型 于是有下面的写法:
我们的实体类都有这个特性, 所以直接继承即可
解析
解析数据类型2
特殊处理步骤:
① 封装好多语言基类LanguageBean<T>
② 多语言实体类继承LanguageBean<T>
③ 获取多语言实体数据时, 要用beanget()获取对象
好处
① 增删改语言, 只需在基类LanguageBean<T>修改即可, 其它地方完全不需要修改
② 切换语言时: 只需赋值给languageType即可
③可切换回方式1 (网络请求的时候, 带一个语言类型参数) , 只需languageType = "" 即可
封装好以后, 即使后台要重构, 使用方式1处理多语言, 我们也只需修改一个字段即可
你说的不是在程序中切换语言吧,是语言国际化吧,就是在设置里面改变语言类型,比如英文,程序显示的也是英文,
Android 中要实现国际化比较简单。
字符串国际化:只要在 res 文件夹下新建对应语言的 values 文件夹就好了,
如,英语环境下的,文件夹命名为:values-en
美国英文环境:values-en-rUS
中文环境为:values-zh
大陆地区中文环境: values-zh-cn
在 eclipse 下新建 Android 项目时,会在 res 目录下自动创建一个默认语言环境的文件夹 : values
当某一个资源没有在语言环境的对应的资源集合中找到时,就会使用 values 下的资源。
若某一个语言环境没有在项目中定义语言环境,那么也会使用 values 下的资源。
目前主流的屏幕密度:240dpi (480 800px) , 320dpi (7201280px) , 480dpi(10801920px)现在新出的手机几乎全是全高清屏(10801920px)
Android资源目录
mdpi [1倍]160dpi
hdpi [15倍] 240dpi
xhdpi [2倍] 320dpi
xxhdpi [3倍] 480dpi
xxxhdpi [4倍] 640dpi
因此对其他资源的建议是:
a一般采用720 1280的屏幕尺寸设计,这样切图可以直接适配720 1280的机型。
b720 1280下切的图基本可以适配大部分机型。
d适配480 800的机型,只需要把切图 075。
e适配1080 1920 的机型,只需要把切图 150即可。
a以720 1280作为设计标准,画布大小定位720 1280 (以后10801920px做标准亦可,类推)
b只使用偶数单位的尺寸
c尽量只使用 24pt, 28pt , 32pt, 44pt大小的字体
d设计完成之后,所有尺寸的px值除以2作为dp数据交给开发人员
e三份切图,分别是:xhdpi,hdpi,mdpi的资源,如果要切一份就使用xhdpi
栅格系统的最小单位是8dp,一切距离、尺寸都应该是8dp的整数倍,所有可 *** 作元素最小点击区域尺寸为48dp X 48dp。以下是一些常见的尺寸与距离:
有时候在自定义view,draw的时候单位往往是px,要做一个dpi的转换,需要通过该类获取屏幕的信息,如:屏幕密度,宽高等。
a尽量使用线性布局(LinearLayout)和相对布局(RelateLayout),尽量不使用绝对布局(AbsoluteLayout)和帧布局(FrameLayout)。
b尽量使用wrap_content、mach_parent让view自适应或最大化,尽量不要写宽高的值。
c使用线下布局的百分比weight权重时,要把能伸缩方向的宽度写成“0dp“,如果写成wrap_coent会使布局效果不佳等问题。
d尽量使用android的Shape自定义view背景,这样会随之自适应。
eImageView的ScaleType有几种方式:matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY;尽量使用fitCenter按比例扩大至view宽度,能取得较好适配和显示效果。(更多请参考: Android中的ImageView配适 )
f获取屏幕分辨率信息,进行动态适配。(参考第三大点)
a把屏幕设置成单一的横屏或竖屏:
b根据横竖屏加载不同布局(android: screenOrientation="sensor")
通过thisgetResources()getConfiguration()orientation来判断当前是横屏还是竖屏,然后在onCreate方法中加载不同的布局
采用第二种方式要注意的有两点
布局问题:
需要在res目录先建立layout-land和layout-port目录相应的xml文件名字相同,然后在两个文件夹下创建相同名字的两套xml,系统就会根据不同的屏幕来进行自动寻找。
切换时activity的生命周期:
activity生命周期在切换横竖屏会有一些有趣的变化
a不设置activity的android:configChanges时,切换横屏,activity的生命周期会重新调用一次,但是切换竖屏时,生命周期会重新调用两次。
b当设置activity的android:configChanges=“orientation”时,切换横竖屏都会重新调用各生命周期一次。
c当设置activity的android:configChanges=“orientation|keyboardHidden”(大于api13时,需要设为“orientation|screenSize”)时,切换横竖屏不会重新调用各生命周期,只会调用onConfigurationChanged方法。
一般设为b或者c
平板应用的特性:
对于大屏幕的平板8英寸以上(参考ipad mini,现在很多高端手机都是5-6英寸了,8英寸以上视为平板吧),基与平板应用的特性,平板应用开发一般采取如下两种策略
1)兼容模式
采用单activity(或者尽量少activity)+多fragment的结构开发应用,在layout资源文件中创建三套布局:手机布局、平板横屏布局、平板竖屏布局。
优点:
只需要维护一个app
缺点:
设计及实现的难度变大,更复杂,有时候需要采取折衷方案
手机apk上由于含有平板的大分辨率资源(设计上可以减少内置资源)
2)开发另一套只适配平板的app
优点:
与手机app分离独立。不会因为要兼容而采用一些折衷方案,影响其性能、内存
设计和实现更加自由
缺点:
需要维护两套app
目前谷歌推荐第一种方案,但是国内很多应用是采取第二种方案。
可以通过判断sdk的版本(BuildVERSIONSDK_INT),来为能够使用的版本进行个性化设置
例如:沉浸式状态栏配适
在Android系统44以前,状态栏的背景色和字体颜色都是不能改变的。但是44以后Google增加了改变状态栏背景透明的方法。可以通过判断sdk的版本,来为能够使用的版本进行个性化设置:
沉浸式状态栏是Android在50中引入的,在50之前是没有的,并且在Android60中沉浸式状态栏的使用方法和50不一样,因此需要做到版本兼容,针对于不同的Android进行适配,同样也是通过判断BuildVERSIONSDK_INT来区分版本,进行个性化配适
沉浸式状态栏的实现方式有好几种,更多请参考 沉浸式状态栏的实现
原则:内置资源不应该出现文字(如果出现文字需要具备)、所有的文字需要放在res资源目录特定语言目录下。
如果你想开发一个Android应用程序,你可能想利用java、Kotlin、C++、C语言或Lua来给你的应用程序带来成功的最佳机会。
1JAVA
JAVA被视为官方的Android开发编程语言。由于内置的开放源码库可供用户选择,JAVA易于处理,并提供了最佳的文档和社区支持。其丰富的功能让您可以自由开发最佳的跨平台应用程序、Android应用程序、游戏、服务器应用程序、嵌入式空间、网站等。
因此,JAVA也是使用最广泛的语言。许多PlayStore应用程序都是用JAVA构建的,它也是Google最支持的语言。JAVA还提供了一个很好的在线社区,在出现任何问题时提供支持。
然而,JAVA对于初学者来说是一种复杂的语言,因为它包含复杂的主题,如构造函数、空指针异常、并发性、标记异常等。此外,Android软件开发工具包(SDK)将复杂性提升到了一个新的水平。
总的来说,JAVA是体验Android应用程序开发所有乐趣的绝佳语言。
2Kotlin
据说Kotlin是Java的高级版本,是一种用于开发现代Android应用程序的统计编写的编程语言。Kotlin也被认为是应用程序的最佳语言。Kotlin有可能影响其他编程语言,如JAVA,以创建健壮和高性能的应用程序。Kotlin内置的一些流行应用程序有Coursera、Trello、Evernote等。
Java和Kotlin之间唯一显著的区别是Kotlin删除了多余的Java特性,例如空指针异常。简单地说,从程序员的角度来看,Kotlin比Java更容易让初学者进行测试,也可以作为Android应用程序开发的“入口点”。
3C++
C++是许多顶级移动应用开发公司的首选。它是一种通用的、面向对象的语言,具有通用性和低级别内存 *** 作的特性。
用于Android应用程序开发和本地应用程序,C++可以开发游戏、基于GUI的应用程序、实时数学模拟、银行应用程序等等。C++在云计算应用中很受欢迎,因为它可以很快适应硬件或生态系统的变化。
C++可以用于Android应用程序开发,使用原生Android开发工具包(NDK)。但是,应用程序不能完全使用C++来创建,NDK用于实现本地C++代码中应用程序的部分。它有助于在需要时使用C++代码库作为应用程序。
虽然C++在某些情况下对Android应用程序开发很有用,但是配置更难,灵活性也就差得多。由于复杂性的增加,它还可能产生更多的错误。因此,最好使用java与C++相比,因为它不能提供足够的增益来弥补所需的努力。
4C#
C#与Java非常相似,非常适合Android应用程序开发。与Java一样,C#也实现垃圾收集,因此内存泄漏的可能性较小。C#还有更简洁的语法,这使得编码相对容易。
以前,C#最大的缺点是它只能在Windows系统上运行,因为它使用NET框架。然而,这个问题是由Xamarin处理的,Xamarin是公共语言基础设施的跨平台实现。现在,XamarinAndroid工具可以用来编写原生Android应用程序,并跨多个平台共享代码。
C#被称为“C-sharp”,作为一种广泛用于移动开发(主要用于Windows跨平台应用程序开发)的通用、面向对象编程语言,在市场上占有显著地位。
如果您计划开发高性能和交互式游戏应用程序,这是最好的语言。
5Lua
Lua是一种跨平台的多范式编程语言。它是一种重量轻、移动第一的企业通信解决方案。Lua为企业内置的消息传递提供了强大的支持,它是即时的、安全的,并使开发人员对其负责。
由于实时安全消息、分析仪表板、轻松的文件共享和双触式电话会议,这种语言变得流行起来。如果您希望提高应用程序的可移植性、速度、可靠性和可扩展性,Lua是一个完美的选择。
使用上述编程语言可以创建许多应用程序,如聊天信使、音乐播放器、游戏、计算器等。正如你所知,没有一种语言可以被称为“正确的语言”
因此,根据每个项目的目标和偏好,选择正确的语言取决于您自己。与合适的Android应用程序开发公司取得联系,为您的企业带来成功的礼物。
以上就是关于Android 多语言适配全部的内容,包括:Android 多语言适配、android 多语言--后台返回数据处理、android怎么在自己的程序中切换语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)