Android-获取和指定APP的locale

Java代码:
package com.ayukyo;

import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {
 
    SharedPreferences sharedPreferences;
      Editoreditor;
      privatestatic final String SP_NAME = "test";
      privatestatic final String SP_LOCALE = "locale";
      privatestatic final String LOCALE_EN = "en";
      privatestatic final String EXTRA_LOCALE = "locale";
      //对比模式
      privatestatic final int COMP_MODE_CREATE = 0;// create一个Activity时
      //实时,发生在用户开启项目后,修改设备语言,动态改变Activity语言显示
      // 跳转
      privatestatic final int COMP_MODE_REALTIME = 1;
      //重新进入
      privatestatic final int COMP_MODE_RECREATE = 2;

      Handlerhandler = new Handler();

      StringlocaleFromSP;
      LocalelocaleForReCreate;
      Resourcesres;
      Configuration cfg;
      Timertimer;
      Tasktask;

      TextViewtv;

      @Override
      public voidonCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            boolean firstEnterFlag = true;

            // 动态更新当前显示Activity的语言
            Intent intent = getIntent();
            if (intent != null) {
                  String localeString =intent.getStringExtra(EXTRA_LOCALE);
                  if (localeString != null) {
                        localeForReCreate = newLocale(localeString);
                        updateLocale(COMP_MODE_RECREATE);
                        firstEnterFlag = false;
                  }
            }

            if (firstEnterFlag) {
                  // 比较本地SP文件与系统语言
                  updateLocale(COMP_MODE_CREATE);
            }

           
            setContentView(R.layout.main);
            tv = (TextView) findViewById(R.id.tv);

            // 以下代码为显示
            String resultsTextFormat =getResources().getString(
                        R.string.search_results_resultsTextFormat);

            resultsTextFormat =String.format(resultsTextFormat, cfg.locale);
            Log.e("styledResults", "" +resultsTextFormat);
            tv.setText(resultsTextFormat);

            // 以下代码,研究动态更新语言。这里,使用的是动态监控。
            // 真实项目中,也可以考虑点击屏幕定义的“刷新语言”按钮来更新
            timer = new Timer();
            task = new Task();
            timer.schedule(task, 1000, 5000);

            if (savedInstanceState == null) {
                  savedInstanceState =getIntent().getBundleExtra("InstanceState");
                  if (savedInstanceState != null) {
                        Log.e(this.getClass().toString(),"savedInstanceState != null");
                        onRestoreInstanceState(savedInstanceState);
                  }
            }
      }

      voidupdateLocale(int mode) {
            sharedPreferences = getSharedPreferences(SP_NAME,0);
            localeFromSP =sharedPreferences.getString(SP_LOCALE, null);

            // 获取本地当前实时locale
            res = this.getResources();
            cfg = res.getConfiguration();

            switch (mode) {
            case COMP_MODE_REALTIME:
                  Log.e(this.getClass().toString(),"COMP_MODE_REALTIME");
                  if (localeFromSP != null&&!localeFromSP.equals(cfg.locale)) {
                        Bundle bundle = new Bundle();
                        onSaveInstanceState(bundle);
                       
                        Intent intent = new Intent(this,this.getClass());
                        intent.putExtra(EXTRA_LOCALE,cfg.locale.toString());
                        intent.putExtra("InstanceState", bundle);
                        intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
                        startActivity(intent);
                        finish();
                  }
                  break;
            case COMP_MODE_CREATE:
                  Log.e(this.getClass().toString(),"COMP_MODE_CREATE");
                  if (localeFromSP == null) {
                        editor = sharedPreferences.edit();
                        // editor.putString(SP_LOCALE,locale.toString());
                        // 这里,我们假设把项目固定在英文环境下
                        editor.putString(SP_LOCALE, LOCALE_EN);
                        editor.commit();
                  }

                  localeFromSP =sharedPreferences.getString(SP_LOCALE, null);
                  // 注释以下三行代码,屏幕显示的是:当前设定的项目执行语言是 zh_CN!
                  // 不注释以下三行代码,屏幕显示的是:current lang is en!表明指定该Activity语言成功!!!
                  Locale locale = new Locale(localeFromSP);
                  cfg.locale = locale;
                  res.updateConfiguration(cfg, null);
                  break;
            case COMP_MODE_RECREATE:
                  Log.e(this.getClass().toString(),"COMP_MODE_RECREATE");
                  cfg.locale = localeForReCreate;
                  res.updateConfiguration(cfg, null);
                  break;
            default:
                  break;
            }

      }

      privateclass Task extends TimerTask {
            @Override
            public void run() {
                  handler.post(new Runnable() {
                        @Override
                        public void run() {
                              Log.e(this.getClass().toString(), "Task");
                              updateLocale(COMP_MODE_REALTIME);
                        }
                  });
            }
      };

      @Override
      protectedvoid onDestroy() {
            Log.e(this.getClass().toString(),"onDestroy");
            if (task != null) {
                  task.cancel();
                  task = null;
            }
            if (timer != null) {
                  timer.cancel();
                  timer = null;
            }
            super.onDestroy();
      }
}

-----------------------------------------------------------------------------
/res/layout/main.xml
<?xml version="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      >
<TextView 
      android:id="@+id/tv"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="@string/hello"
      />
</LinearLayout>

---------------------------------------------------------------------------------
/res/values/strings.xml
<?xml version="1.0"encoding="utf-8"?>
<resources>
      <string name="hello">Hello World,MainActivity!</string>
      <stringname="app_name">MyWeb</string>
      <stringname="search_results_resultsTextFormat">当前设定的项目执行语言是%1$s!</string>
</resources>
--------------------------------------------------------------------------------
/res/values-en/strings.xml
<?xml version="1.0"encoding="utf-8"?>
<resources>
      <string name="hello">Hello World,MainActivity!</string>
      <stringname="app_name">MyWeb</string>
      <stringname="search_results_resultsTextFormat">current langis %1$s!</string>
</resources>

---------------------------------------------------------------------------------
源码下载:http://vdisk.weibo.com/s/18eye
讲解:http://vdisk.weibo.com/s/16Dtn  第6,第7节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值