Android开发学习笔记秘籍(十八)

实习阶段,学长安排了一个任务要求我对一个已完成的APP添加一个多语言切换的功能。本以为会很轻松的搞定,最后竟然忙活了我一早上!不过还是很庆幸最后完成了。

本以为多语言切换的教程会很多也很容易实现,但没想到都与理想效果有差距。理想效果是选择切换某种语言后,本页面刷新,转换为选择的语言然后选择其他页面显示的也是选择的语言,这里有一点要说明,我这里只是改变了App内的语言,本机的语言是没有改变的(本机语言就是你在“设置”里面的设置的)

效果:

效果如下:


在不点击Change Language时,跳转到别的界面显示的还是英文,但点击了切换语言后,不仅当前页面的语言变成了中文,跳转到别的语言也是中文。


界面布局:

界面布局要说的可不是activity_main,activity_main的布局很简单,几个TextView和几个Button组成就是了,这里主要说的是string.xml的布局,要实现多语言的切换就要设置多个string.xml,但string.xml的设置又不是那么的随便,这里的 http://blog.csdn.net/liyuchong2537631/article/details/48292385介绍了Android studio设置多个string.xml,很详细,后面的不就不敢恭维了,我按照他的来失败了。

重要代码:

其实在完成多个string.xml的设置后你的App就已经具备多语言切换的功能了只是操作复杂了点,你得去“设置”里面去设置本机语言还是贴张图看看吧


对吧,神奇吧。App会根据你本机的语言来选择需要加载的string.xml。但这操作也太特么蛋疼了吧,换个语言还把我全机的语言换了,简直了!所以我们还需要改进。


那实现上面效果的代码是怎么样的呢?没错,网上大家搜到的多语言切换的主代码都基本是这个:

public void setLocale(String lang) {      
    myLocale = new Locale(lang);      
    Resources res = getResources();      
    DisplayMetrics dm = res.getDisplayMetrics();      
    Configuration conf = res.getConfiguration();      
    conf.locale = myLocale;      
    res.updateConfiguration(conf, dm);      
} 

我用的也是这个,但大家如果直接照这网上这样来我觉得多半会出现和我一样的问题,就是没效果,无论你AndroidMainifest.xml中有没有设置

android:configChanges="locale"
(上面这个在Activity这个标签下设置)

我自己测试的时候确实没有效果,不然也不至于搞一早上。问题出在哪里呢?贴代码和效果给大家看看:

        btn_refresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setLocale();

                Intent intent = new Intent(MainActivity.this, MainActivity.class);
                startActivity(intent);
            }
        });
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, Language.class);
                startActivity(intent);
            }
        });

    }


setLocale()的代码已经贴在上面了,我改了一个地方就是把它设置成转换成中文而已(不用参数了),效果我就不放图了,效果是就是新打开的MainActivity并没有切换语言,但你把setLocale()后面两句换掉,换成setContentView(R.layout.activity_main)的话,恭喜你,你可以看到语言切换了,但最大的问题出现了,你重新setContentView一遍后,按钮不能点了!!!因为你onCreate里setContentView时初始化了Button,它们还指向原来Button,所以点击无效,除非你再来一遍视图的findViewById,我这里之所以重开一遍MainActivity正是这个原因(为了执行setContentView,又不用再来一遍findViewById),但为什么没有效果我不得而知,如果有哪位大神不小心看到这篇文章请务必告诉我原因,(我猜是updateConfiguration这个函数的锅,想知道估计得研究源码)。

在搜索了不少有测试了不少代码后,最后只有下面这种成功了,代码如下:

btn_refresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Configuration newConfig = new Configuration();
                newConfig.locale = Locale.SIMPLIFIED_CHINESE;
                onConfigurationChanged(newConfig);

                Intent intent = new Intent(MainActivity.this, MainActivity.class);
                startActivity(intent);
            }
        });
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, Language.class);
                startActivity(intent);
            }
        });

    }
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
//        setContentView(R.layout.activity_main);
        Log.e("哈哈哈哈哈哈哈","onConfigurationChanged had done");

    }


这里调用了onConfigurationChanged的方法,成功的修改了config并更新成功,但奇怪的是什么呢?它主要的代码还是setLocale()但就是成功了......

注意事项:

updateConfiguration之后一定要setContentView,原因就是setContenView就是需要把string,xml的数据读出来,填充视图所以当你修改好了Config之后一定要记得setContentView,而单纯的setContentView会导致onCreate中设置的控件初始化出现无效的结果。


 


源码下载:


http://download.csdn.net/detail/cuihaoren01/9478262


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值