覆盖Android应用程序中的区域设置

时间:2012-01-18 21:02:27

标签: android locale

我知道已经有很多关于这个话题的问题,但我根本无法让它发挥作用。

我想要实现的目标如下:

无论使用何种语言,Android手机都会启动我的应用程序。从那时起,语言环境被“en”覆盖。当用户关闭应用程序时,语言环境将再次设置为默认值。

我用简单的调试吐司创建了最基本的应用程序。我的手机使用的语言不是“en”,但是在我启动应用程序后,我仍然得到我的默认值而不是值“en”。

我做错了什么?

代码:

package com.locale.test;

import java.util.Locale;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.Toast;

public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume() {
        super.onResume();

        Locale locale = null;
        Configuration config =null;
        config = getBaseContext().getResources().getConfiguration();
        locale = Locale.ENGLISH;
        Locale.setDefault(locale);
        config.locale = locale;
                    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    }

    /***********************************************************************************************
     * Debug
     **********************************************************************************************/

    @Override
    public boolean onSearchRequested() {
        String density;
        String orientation;

        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);

        if(metrics.densityDpi == DisplayMetrics.DENSITY_HIGH){ density = "HDPI"; } else
        if(metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM){ density = "MDPI"; } else
        if(metrics.densityDpi == DisplayMetrics.DENSITY_LOW){ density = "LDPI"; } else
        { density = "DEFAULT"; };

        if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
            orientation = "Portrait";
        } else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
            orientation = "Landscape";
        } else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_SQUARE){
            orientation = "Square";
        } else {
            orientation = "Undefined";
        }

        Toast.makeText(this, "Density = " + density + "\n" +
                             "Orientation = " + orientation + "\n" +
                             "Width = " + metrics.widthPixels + "\n" +
                             "Height = " + metrics.heightPixels + "\n" +
                             "Locale = " + Locale.getDefault(), Toast.LENGTH_LONG).show();      
        return super.onSearchRequested();
    }
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.locale.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="4" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:configChanges="locale">
        <activity
            android:name=".Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

2012年1月19日更新:

添加了:

getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

将语言区域更改为:

 locale = Locale.ENGLISH;

2 个答案:

答案 0 :(得分:1)

我想您忘了在Resources对象上致电updateConfiguration()

此外,我认为这不重要,但我会使用Locale.ENGLISH常量。

答案 1 :(得分:1)

我认为你不应该尝试在onResume方法中这样做。我刚刚在onCreate方法中测试了它(在设置布局setContentView(int)之前)并且它运行良好。 此外,它应该可以正常工作,屏幕方向改变。 代码如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Configuration configuration = new Configuration();
    configuration.locale = Locale.FRANCE;
    getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics());

    setContentView(R.layout.main);
}

我在AndroidManifest.xml文件中添加了android:configChanges =“locale”,并在res中创建了值-fr文件夹。