android多语言切换,代码简洁易懂

效果图:
android 多语言切换

demo下载:

android多语言切换 - 下载频道 - CSDN.NET
http://download.csdn.net/detail/baidu_31093133/9775830

核心代码:

//获取资源
 Resources resources = getResources();
//获取配置
        Configuration configuration = resources.getConfiguration();
        //获取屏幕
        DisplayMetrics dm = resources.getDisplayMetrics();
        switch (language) {
            case "zh":
            //设置语言
                configuration.locale = Locale.SIMPLIFIED_CHINESE;
                break;
            case "en":
                configuration.locale = Locale.ENGLISH;
                break;
            default:
                configuration.locale = Locale.ENGLISH;
                break;
        }
        //更新语言
        resources.updateConfiguration(configuration, dm);

如何让配置立即生效呢?

我们在设置页面修改了默认的语言配置之后,销毁所有的activity并重启MainActivity,他就会重新加载资源文件。语言修改就生效了。

问题:销毁所有的Activity
自定义一个Application类,初始化一个list,将每一个activity都加入到这个list,销毁所有activity就遍历这个List,逐一调用finish方法即可。

建立一个BaseActivity,所有的Activity都继承自BaseActivity,在onCreate方法里把activity加入lIst,在onDestroy方法里移除activity
在onResume方法里,判断当前保存的语言是中文还是英文,如果是英文就加载英文资源,中文就加载中文资源。

以下是代码:

App.java

public class App extends Application {
    private static Context mContext;
    private static App sInstance;
    public static int SCREEN_WIDTH;


    //用List来保存每一个activity
    private List<Activity> mActivities = new LinkedList<Activity>();

    @Override
    public void onCreate() {
        super.onCreate();
        init();
    }


    private void init() {
        mContext = getApplicationContext();
        sInstance = this;
        ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        Point screen = new Point();
        SCREEN_WIDTH = Math.min(screen.x, screen.y);
    }

    public static Context getContext() {
        if (mContext == null) {
            throw new NullPointerException("App Context is Null");
        }
        return mContext;
    }

    public static App getInstance() {
        if (sInstance == null) {
            throw new NullPointerException("App sInstance is Null");
        }
        return sInstance;
    }

    /**
     * 获得当前进程的名字
     *
     * @param context
     * @return
     */
    public static String getCurProcessName(Context context) {

        int pid = android.os.Process.myPid();

        ActivityManager activityManager = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);

        for (ActivityManager.RunningAppProcessInfo appProcess : activityManager
                .getRunningAppProcesses()) {

            if (appProcess.pid == pid) {

                return appProcess.processName;
            }
        }
        return null;
    }

    //关闭所有Activity
    public void addActivity(Activity activity) {
        mActivities.add(activity);
    }

    //移除Activity
    public void removeActivity(Activity activity) {
        mActivities.remove(activity);
    }

    public void exit() {
        try {
            for (Activity ac :
                    mActivities) {
                if (ac != null) {
                    ac.finish();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        System.gc();
    }

}

BaseActivity.java

public abstract class BaseActivity extends AppCompatActivity {

    //防止重复点击
    private long lastClickTime;

    private Context ctx;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ctx = this;
        App.getInstance().addActivity(this);
        initContentView();
        initViews();
    }

    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        super.setContentView(layoutResID);
        ButterKnife.bind(this);
    }

    @Override
    public void setContentView(View view) {
        super.setContentView(view);
        ButterKnife.bind(this);
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        super.setContentView(view, params);
        ButterKnife.bind(this);
    }

    /**
     * 初始化布局
     */
    protected abstract void initContentView();

    /**
     * 初始化View
     */
    protected abstract void initViews();


    private boolean isFastDoubleClick() {
        long time = System.currentTimeMillis();
        long timeD = time - lastClickTime;
        if (0 < timeD && timeD < 500) {
//            LogUtil.i("main fast click");
            return true;
        }
        lastClickTime = time;
        return false;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            if (isFastDoubleClick()) {
                return true;
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    public Context getCtx() {
        return ctx;
    }

    @Override
    protected void onResume() {
        super.onResume();
        String language = (String) SPUtil.get(ctx, "language", "");
        Locale locale = Locale.getDefault();
        String defaultLanguage = locale.getLanguage();
        if (!language.equals(defaultLanguage)) {
            showLanguage(language);
        }
    }

    private void showLanguage(String language) {
        Log.i("LHD", "选择的语言: " + language);
        Resources resources = getResources();
        Configuration configuration = resources.getConfiguration();
        DisplayMetrics dm = resources.getDisplayMetrics();
        switch (language) {
            case "zh":
                configuration.locale = Locale.SIMPLIFIED_CHINESE;
                break;
            case "en":
                configuration.locale = Locale.ENGLISH;
                break;
            default:
                configuration.locale = Locale.ENGLISH;
                break;
        }
        resources.updateConfiguration(configuration, dm);
        SPUtil.put(getCtx(), "language", language);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        App.getInstance().removeActivity(this);
    }
}

其它代码请参考demo(^__^)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值