Android 系统语言切换监听和设置实例代码

最近项目上产品经理提了个需求,要求关闭语言国际化,不管手机系统设置那个国家的语言,都要显示汉语,好吧,既然有需求,那就做吧。但是项目中已经有英文的配置了,且是作为默认String提供的,这么多翻译好的文字,直接删除掉替换成中文为默认String又感觉弃之可惜。故网上Google下解决方案。就开始往下看吧。

一、代码中动态设置应用显示语言(手动控制使用values-zh-rCN下字符串)

这个方法是通过改变Resource中的配置来实现的,代码如下:

public static void initAppLanguage(Context context) { if (context == null) { return; } Locale.setDefault(Locale.CHINA); Configuration config = context.getResources().getConfiguration(); config.locale = Locale.CHINA; context.getResources().updateConfiguration(config , context.getResources().getDisplayMetrics()); }

上面方法我们可以在MyApplication中设置也可以在Activity的基类中调用

但是上面的方法还是不足以让我们的应用一直显示指定的某种语言文字的。因为我们的应用在运行阶段中,系统语言发生了改变后,我们的应用还是会被切换语言的,如果没有指定语言,就显示默认的语言。这肯定不是我们要看到的结果,那就到了标题中提到的语言切换监听了。

二、语言切换监听

1.广播方式监听

我们可以通过监听系统广播来实现(广播静态注册动态注册都可以,动态注册把握好注册时机)

/** * ClassName: LocaleChangeReceiver * Description:(这里用一句话描述这个类的作用) * Created by chensf on 2016-8-17 16:47. */ public class LocaleChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.v(TAG, "mReceiver onReceive intent.getAction(): "+intent.getAction()); if(intent.getAction().equals(Intent.ACTION_LOCALE_CHANGED)) { Log.e("LocaleChangeReceiver","Language change"); SystemUtil.initAppLanguage(context); } } }

这里我们通过监听Intent.ACTION_LOCALE_CHANGED广播,在系统语言切换后我们会得到通知,然后就爱干嘛干嘛了,这里我通过调用上面 提到的设置语言方法,将语言设置为初始设定语言。网上大多都是采用这种方式来监听语言切换,其实还有另外一种方式。

2.重写onConfigurationChanged方法

一些系统设置变化后都会回调这个方法,所以我们可以从这里下手。

那在哪里重写这个方法呢,这个方法大家是不是感觉很熟悉,监听横竖屏切换是不是有用到过呢,提到横竖屏切换,这里顺便讲点题外话

在横竖屏切换的时候,我们为了避免Activity重新调用onCreate,一般都会重写这个方法,但是,横竖屏切换后Activity没有调用onConfigurationChanged而是依旧调用了onCreate,因为我们Activity默认是不回调onConfigurationChanged的,开启方法就是

<activity android:name=".MainActivity" android:configChanges="orientation|screenSize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

在AndroidManifest中Activity标签下添加android:configChanges="orientation|screenSize,orientation是横竖屏切换的配置,至于为什么要同时加上screenSize,是因为Android3.0之后,如果只设置orientation没有设置screenSize,onConfigurationChanged依旧不会被回调。

那回归正题,大家通过上面的例子知道了这个onConfigurationChanged要在Activity中重写,配置跟上面一致,参数改变了而已

<activity android:name=".MainActivity" android:configChanges="locale|layoutDirection"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

android:configChanges="locale|layoutDirection 这里同样存在一个问题,4.2之前的系统只需要设置locale,4.2+就得多设置layoutDirection这个配置,不然onConfigurationChanged依旧不会被回调。

上面的在Activity重写onConfigurationChanged方式明显存在一个缺点,如果只需要改变某个Activity的语言设置,上面的方式可以适用,如果要改变整个应用的语言设置,上面的方式就很low,要每个Activity都重写onConfigurationChanged,虽然可以在Activity基类中重写,但是,AndroidManifest中还是得每个Activity标签下都去设置
android:configChanges="locale|layoutDirection,说了这么多就不绕弯子了,我们可以在Application中重写onConfigurationChanged

@Override public void onConfigurationChanged(Configuration newConfig) { Log.e("MyApplication","onConfigurationChanged"); super.onConfigurationChanged(newConfig); SystemUtil.initAppLanguage(getBaseContext()); }

这个配置是整个应用设置的,在这里设置语言,能够改变整个应用的语言设置,而且这种方式,无需在AndroidManifest中增加配置,我测试过,在Application中重写onConfigurationChanged,Activity的onConfigurationChanged

依旧能够回调到,但是其中有没有造成什么影响,我这里暂时没有发现。如果有采用我提供的这种方式实现语言切换监听的,遇到问题可以告诉我,我们一起探讨下。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-12-23 13:48:53

Android 系统语言切换监听和设置实例代码的相关文章

Android监听电池状态实例代码_Android

如果要监听电池的状态改变,需要动态注册:android.intent.action.BATTERY_CHANGED,收到Action后可以根据对应的Key获取你需要的信息,更详细信息可以参考以下例子中的BatteryChangedReceiver类 具体代码如下所示: package com.example.charginganimation; import android.app.Activity; import android.content.BroadcastReceiver; impor

android音乐播放器监听电话状态实现代码_Android

如下代码是监听电话的状态,代码简单不做介绍直接看代码: 复制代码 代码如下:  private boolean mResumeAfterCall = false; private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {  @Override  public void onCallStateChanged(int state, String incomingNumber) {   if (state =

在Android系统中使用gzip进行数据传递实例代码_Android

接下来让我解说一下如何在Android系统中使用gzip进行数据传递 HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来减少文件大小减少文件大小有两个明显的好处一是可以减少存储空间二是通过网络传输文件时可以减少传输的时间.作者在写这篇博客时经过测试4.4MB的文本数据经过Gzip传输到客户端之后变为392KB压缩效率极高. 一.服务端 服务端有2种方式去压缩一种可以自己压缩但是更推荐第二种方式用PrintWriter作为输出流工具类代

Android打印机--小票打印格式及模板设置实例代码

小票打印就是向打印设备发送控制打印格式的指令集,而这些打印格式需要去查询对应打印机的API文档,这里我把常用的api给封装了一下 文字对齐方式 打印字体大小 字体是否加粗 打印二维码 打印条形码 切纸 打开钱箱 字符串转字节数组 字符拼接 PrintFormatUtils.Java /** * 打印格式 * Created by john on 17-3-23. */ public class PrintFormatUtils { // 对齐方式 public static final int

系统中实时监听android的网络状态并且给予处理

问题描述 系统中实时监听android的网络状态并且给予处理 比如 在一个android小程序中 发现网络断了就给予页面跳转 解决方案 分几个步骤 1.监测手机上的网络连接状态 2.及时连接网络不一定可达,尝试连接服务器,如果通,则网路通. 解决方案二: 周期性检测网络连接>. 解决方案三: /** * 网络请求失败处理 */ public void requestNetDataFail(ErrorInfo errorInfo) { switch (errorInfo.errorCode) {

Android实现系统语言切换功能_Android

简单介绍下这个需求的缘由,这段时间因公司业务需要,其中有一项"设置系统语言"功能,就是在使用APP的过程中,动态的去切换整个Android机器的语言,具体参照手机设置页面有语言切换功能.起初想来是很简单的事情嘛,不就是个简单的资源国际化嘛,strings.xml资源文件一整还不给OK?真正动起手来就真不是这么一回事了,国际化是没问题,但是怎样能更改所有页面的文字资源呢,这是一个问题.下面介绍下网上找的几个方案. 一.API欺骗 烧制到手机中的android.jar包含了Android所

Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

随着移动互联网的快速发展,它已经和我们的生活息息相关了,在公交地铁里面都能看到很多人的人低头看着自己的手机屏幕,从此"低头族"一词就产生了,作为一名移动行业的开发人员,我自己也是一名"低头族",上下班时间在公交地铁上看看新闻来打发下时间,有时候也会看看那些受欢迎的App的一些界面效果,为什么人家的app那么受欢迎?跟用户体验跟UI设计也有直接的关系,最近在美团和大众点评的App看到如下效果,我感觉用户好,很人性化,所以自己也尝试着实现了下,接下来就讲解下实现思路!

android listview里面Radiogroup监听事件混乱

问题描述 android listview里面Radiogroup监听事件混乱 public class AdapterTest extends ArrayAdapter { private int resourceId; List<Test> listTest = new ArrayList<Test>(); private ViewHolder viewHolder; public AdapterTest(Context context, int resource, List

android开发 如何实现 监听点击屏幕任意位置事件

问题描述 android开发 如何实现 监听点击屏幕任意位置事件 好比一个导航页,当滑倒最后一页时,提示用户点击屏幕的任意位置进入MainActivity.这种点击事件如何响应? 解决方案 原来是这样的啊啊,这下我知道啦 解决方案二: 最简单的就是,在视图最上面加个控件(全屏显示),背景设置为透明,先设置为gone,滑动到最后页面,显示出来就可以了,然后给这个控件加个事件--