解决之前App内语言切换的某些bug

我也是醉了,之前写的App内多语言切换机制,今天我在公司的项目中发现了Bug,结果处理了两天总算解决了。


如果你有看http://blog.youkuaiyun.com/cuihaoren01/article/details/51027018,这篇文章的话,估计语言切换的机制你基本了解了。这部分内容我就不解释了,先来说说Bug,Bug就是App在休眠的状态下切换屏幕重启后,配置语言变回了本机语言。这么说有点抽象,具体来说就是,(默认你的App必须是横屏的(pad),竖屏的话手机不可能出此问题)比如你在登录界面设置的按钮可以切换语言,你本机语言默认是简体中文,你切换到英文之后,使pad休眠并且把pad竖过来。唤醒屏幕后登录进去,发现语言转换成了中文。按道理应该是英文可显示的确实中文。


Bug产生的原因:

这个问题就涉及到了基本所有的Android生命周期的问题了,我本以为对Android生命周期的理解已经算到位了,结果还是不够深刻。这里就不详述Android的生命周期了,借鉴下别人的博客.


看这两个博客应该可以了解本文需要的Android生命周期的知识了。特别是第一个!onConfigurationChanged的调用机制大家也可以去搜索下。我这里就不给了。

好,回到重点,产生这个Bug的原因如下:我之前在Android开发学习笔记秘籍(十八)中说明了我们要切换语言必须setContentView对吧,而切换屏幕在不加
 android:configChanges="orientation|screenSize|keyboardHidden"
的时候必须会重启整个应用,那这时肯定就会转换成本机语言的。所以我们要添加上面那句话,不执行onCreate(),但你执行 onConfigurationChanged也会切换语言(这个我是真的奇怪,明明要执行updateConfiguration才能更新Config为什么单独的onConfigurationChanged就可以了,具体的研究源码吧。)这样
就导致了语言切换出现了很严重的问题,pad一般是默认竖屏的,你的app虽然强制了横屏但是你从休眠转成唤醒的过程它一定是有屏幕切换的,甚至可能是两次屏幕切换。所以这个问题是必须得解决的!

Bug解决方案:

解决方案网上找了一溜基本就是在调用onConfigurationChanged的过程中在强制导入自己的config,而不是系统的config,代码的话还得要在之前的Android开发学习笔记秘籍(十八)添加一些新的东西。

首先,你得要将你设置的语言写入本地,这样的话你就可以在需要的时候读出语言从而进行设置,代码如下:
public void setLanguage(String language){
        SharedPreferences sp = getSharedPreferences("language_setting", MODE_PRIVATE);
        SharedPreferences.Editor mEditor = sp.edit();
        mEditor.putString("language", language);
        mEditor.commit();
    }
我这里把之前的btn中的点击事件拿出来做成一个函数。
public void switchLanguage(String language){
        Resources resources = getResources();
        Configuration config = resources.getConfiguration();
        DisplayMetrics dm = resources.getDisplayMetrics();
        if(language.endsWith("zh")){
            config.locale = Locale.SIMPLIFIED_CHINESE;
        }else if (language.endsWith("en")){
            config.locale = Locale.ENGLISH;
        }
        resources.updateConfiguration(config, dm);
    }
接着在onConfigurationChanged中添加语言设置。只需要读出你之前写入的语言设置,你在重新设置就好了。
大致的代码结构如下:
public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
            Log.i(TAG, "onConfigurationChanged: 横屏的时候发生了");
        }
        if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Log.i(TAG, "onConfigurationChanged: 竖屏的时候调用了");
        }
        if (newConfig.locale.getLanguage().endsWith("zh")){
            Log.i(TAG, "onConfigurationChanged: 中文");
        }
        if (newConfig.locale.getLanguage().endsWith("en")){
            Log.i(TAG, "onConfigurationChanged: 英文");
        }

        <span style="color:#ff0000;">SharedPreferences sp = getSharedPreferences("language_setting", MODE_PRIVATE);
        String language = sp.getString("language", null);
        switchLanguage(language);
</span>

        Log.i(TAG, "onConfigurationChanged: had been finished");
    }
(测试的那些你就删掉吧。主要就3句话)。这样大致就解决这个Bug了。整个过程就是你首先设置你要切换的语言,同时要把语言写入本地。然后在 onConfigurationChanged中读出,在切换一次即可!




### 关于 Vue Editor 中汉字输入问题的解决方案 当遇到 `vue-editor` 组件中汉字输入出现问题的情况时,通常是因为编辑器内部处理键盘事件的方式与浏览器默认行为存在冲突。为了确保汉字输入法正常工作,建议采取以下措施: #### 修改依赖版本 对于基于 TUI 编辑器构建的应用程序,可以尝试升级至最新稳定版来修复已知缺陷。具体操作是在项目的 `package.json` 文件内将 tui-editor 的定义替换为指定版本[^1]。 ```json "@toast-ui/editor": "^3.1.3" ``` #### 调整配置项 部分情况下,默认初始化参数可能不适合特定语言环境的需求。通过查阅官方文档或社区反馈,适当调整 editor 实例化时传递给组件的 props 属性可以帮助改善兼容性问题。例如,在某些场景下关闭自动补全特性可能会有所帮助。 #### 自定义指令 如果上述方法仍无法解决问题,则考虑编写自定义 v-directive 来拦截并修正 input 事件的行为。这允许更细粒度地控制如何响应用户的按键动作而不影响其他功能模块的工作流程。 #### 示例代码片段 下面给出一段简单的 JavaScript 代码用于演示如何创建一个专门针对中文字符录入优化过的富文本编辑区域: ```javascript import { createApp } from 'vue'; import '@toast-ui/editor/dist/toastui-editor.css'; // Import CSS import Viewer from '@toast-ui/vue-editor'; createApp({ components: { toastEditor: Viewer, }, data() { return { content: '', options: { language: 'zh-CN', // 设置语言为中国大陆简体中文 usageStatistics: false, // 禁用统计分析服务 hideModeSwitch: true, // 隐藏模式切换按钮 toolbarItems: [ ['heading', 'bold', 'italic'], ['fontSize', 'fontFamily'], ['colorPicker', 'link'] ] } }; } }).mount('#app'); ``` 此段代码展示了如何利用 Toast UI 提供的功能选项来自定义编辑界面布局以及启用适合本地化的设置组合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值