android APP国际化一键切换实现

首先看目录:

上代码:

package com.loaderman.language;

import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import java.util.Locale;

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EventBus.getDefault().register(this);
        changeAppLanguage();
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(String str) {
        switch (str) {
            case "EVENT_REFRESH_LANGUAGE":
                changeAppLanguage();
                recreate();//刷新界面
                break;
        }
    }

    public void changeAppLanguage() {
        String sta = Store.getLanguageLocal(this);
        if(sta != null && !"".equals(sta)){
            // 本地语言设置
            Locale myLocale = new Locale(sta);
            Resources res = getResources();
            DisplayMetrics dm = res.getDisplayMetrics();
            Configuration conf = res.getConfiguration();
            conf.locale = myLocale;
            res.updateConfiguration(conf, dm);
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}
package com.loaderman.language;

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

public class Store {

    public static void setLanguageLocal(Context context, String language){
        SharedPreferences preferences;
        SharedPreferences.Editor editor;
        preferences = PreferenceManager.getDefaultSharedPreferences(context);
        editor = preferences.edit();
        editor.putString("language", language);
        editor.commit();
    }

    public static String getLanguageLocal(Context context){
        SharedPreferences preferences;
        preferences = PreferenceManager.getDefaultSharedPreferences(context);
        String language = preferences.getString("language", "");
        return language;
    }
}
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("第一个Activity");
        findViewById(R.id.btn_setting).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SettingActivity.class));
            }
        });
    }
}
package com.loaderman.language;

import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.Button;

import org.greenrobot.eventbus.EventBus;

public class SettingActivity extends BaseActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("设置Activity");
        final String[] cities = {getString(R.string.lan_chinese), getString(R.string.lan_en), getString(R.string.lan_ja), getString(R.string.lan_de)};
        final String[] locals = {"zh_CN", "en", "ja", "de"};
        Button button = (Button)findViewById(R.id.btn_setting);
        button.setText("Language");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(SettingActivity.this);
                builder.setIcon(R.mipmap.ic_launcher);
                builder.setTitle(R.string.select_language);
                builder.setItems(cities, new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        Store.setLanguageLocal(SettingActivity.this, locals[which]);
                        EventBus.getDefault().post("EVENT_REFRESH_LANGUAGE");
                    }
                });
                builder.show();
            }
        });
    }
}

效果图:

原文地址:https://www.cnblogs.com/loaderman/p/10600129.html

时间: 2024-10-11 15:51:31

android APP国际化一键切换实现的相关文章

Android 实现一键切换应用主题颜色(二)

上一篇说到一键切换应用的主题颜色,那么今天就继续来讲一讲如何实现应用的一些图标也一样能够跟随应用的主题颜色切换而改变图标的颜色.比如应用首页的一些固定的展示图标,或者是单选框以及复选框的图标,还有一些功能按钮的图标等等.下面还是老规矩,先上一个效果图(有图有真相有木有?) 上面效果图中已经一目了然了,点击选中下面的图标后,然后再切换相应的应用主题颜色时,可以看到下面所选中的图标也会立即跟随应用的主题颜色进行切换.实现这个功能其实也很简单,不需要把每个颜色的图标都准备一套,一套就足矣了.只不过这一

Android APP 简单高效的禁用横竖屏切换

默认情况下,Android APP的界面会随着手机方向的改变而改变,当手机处于竖屏状态,APP的界面也处于竖屏状态,而当手机处于横屏状态,APP也会自动切换到横屏状态.一般情况下APP的界面都是为竖屏设计的,一旦自动切换到横屏,界面可能就无法直视了.而且每次屏幕方向切换,当前的页面都会销毁并重新创建. 下面先做一个简单的演示 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml

IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源)

接了个变态的需求,要在程序内切换程序语言实现国际化. 可以先看看这个,比较详细. http://blog.csdn.net/xwren362922604/article/details/17190061 看完之后问题来了, 1,工程里面大量的 xib  或 storyboard 里面的UI 设定了text ,怎么实现让它们动态加载语言[非设置系统语言重启] 2,一个简单的思路,当代码触发切换语言 发个通知让 内存里的viewController 刷新UI的text .[工程里这么都vc 每个都加

Android 实现一键切换应用主题颜色

最近项目中要实现切换应用主题的功能,下面就来说一说我在项目中是怎么实现这个功能的,一般我们需要改变整个应用的背景颜色可以直接这样设置getWindow().getDecorView().setBackgroundColor(int color).但是这种方式显然不是我们想要的,而且还有许多不好的地方.为什么呢?第一.它会把整个页面的背景颜色都改变了.第二.布局的背景还必须是透明的才会有效果.所以这种方式有的时候是满足不了我们的需求的.下面我将为大家介绍我的解决方案,下面是一个实现的效果图. 上面

学习Android app 的TAB页面切换

FragmentActivity+ ViewPager + FragmentManager实现 废话少说,直接上我今晚的成果: package com.itfanr.viewpagertab; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.support.v4.app.FragmentTransaction  ; import android.suppo

Android应用内语言切换实现

自定义控件系列结束了,打个回马枪,补上前段时间埋下的一个坑---"应用内语言切换".APP语言改变是一个Configuration,但是这个Configuration和android手机屏幕旋转有点不大一样.屏幕旋转的时候,会destroy当前页面,并进行重新绘制.而切换语言后不会重新绘制页面,所以这种情况的出现造成了网上的一知半解小伙伴们哀声一片,不是在咒骂api的坑爹,就是在卖力的另辟蹊径想尽办法解决问题.思路都是很好的,目的也是坚决的,可是方向是错误的,把哥哥我也给带进了坑了,爬

Android APP架构心得

前言 从JavaEE转到Android开发也2年多了,开发的项目也有4,5个了(公司项目),其中有3个项目前期都是自己独立开发,从一开始的毫无架构到现在对如何架构也有一点心得,所以在此分享出来,大家一起交流 什么是架构 在我看来,软件架构绝对不只是框架的堆砌,看我看来,架构是为了方便软件维护.扩展.安全性.切入性(我也不知道有没有人提出过这个关键字,因为的确很少看见,简单来说我这里说的切入性就是指一个以前没有接触过这个项目的人,能快速加入到这个项目中,对项目进行维护.修改和扩展) 维护性 一个好

Android 学习笔记之切换主题

首先要有主题颜色 theme_color.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 4 <!--红--> 5 <color name="red">#FF6347</color> 6 <color name="dark_red">#F4511E</color> 7 &

Android App性能优化(一)之布局优化

当创建复杂布局的时候,我们会在xml 文件中添加大量的ViewGroup和View.伴随着每次迭代,View树的层次越来越深,界面加载速度越来越慢,消耗的内存也越来越多.当您的程序出现加载时短暂黑屏或横竖切换时短暂黑屏,抑或如内存溢出(OOM)之类的问题时,没准您的程序需要优化了. 那么如何让程序运行速度更快?响应更敏捷?优化布局是一个最基本的方法,本文将介绍最基本的优化布局方法. 1.使用ViewStub实现View的延迟加载. 很多情况下,xml布局文件中的部分View初始状态是设置为不显示