Android-获取和指定APP的locale

本文介绍了一个Android应用如何通过SharedPreferences存储用户选择的语言设置,并实现Activity在不同语言环境间的动态切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、付费专栏及课程。

余额充值