我的用户可以在应用程序内更改区域设置(他们可能想要保持他们的手机设置为英语,但阅读我的应用程序的内容在法语,荷兰语或任何其他语言…)

为什么这在1.5/1.6中工作得很好,但在2.0中就不行了?

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
    case 201:
        Locale locale2 = new Locale("fr"); 
        Locale.setDefault(locale2);
        Configuration config2 = new Configuration();
        config2.locale = locale2;
        getBaseContext().getResources().updateConfiguration(
            config2, getBaseContext().getResources().getDisplayMetrics());
        // loading data ...
        refresh();
        // refresh the tabs and their content
        refresh_Tab ();   
     break;
     case 201: etc...

问题是,每当用户浏览上面的代码行时,MENU就会越来越“缩小”……

这是被缩小的菜单:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, 100, 1, "REFRESH").setIcon(android.R.drawable.ic_menu_compass);
    SubMenu langMenu = menu.addSubMenu(0, 200, 2, "NL-FR").setIcon(android.R.drawable.ic_menu_rotate);
        langMenu.add(1, 201, 0, "Nederlands");
        langMenu.add(1, 202, 0, "Français");
    menu.add(0, 250, 4, R.string.OptionMenu2).setIcon(android.R.drawable.ic_menu_send);
    menu.add(0, 300, 5, R.string.OptionMenu3).setIcon(android.R.drawable.ic_menu_preferences);
    menu.add(0, 350, 3, R.string.OptionMenu4).setIcon(android.R.drawable.ic_menu_more);
    menu.add(0, 400, 6, "Exit").setIcon(android.R.drawable.ic_menu_delete);

    return super.onCreateOptionsMenu(menu);
}

我应该在API级别5中做什么来再次工作?

这里是完整的代码,如果你想测试这个:

import java.util.Locale;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
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
    public boolean onCreateOptionsMenu(Menu menu) {

        SubMenu langMenu = menu.addSubMenu(0, 200, 2, "NL-FR").setIcon(android.R.drawable.ic_menu_rotate);
            langMenu.add(1, 201, 0, "Nederlands");
            langMenu.add(1, 202, 0, "Français");

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()){

        case 201:

            Locale locale = new Locale("nl"); 
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
            Toast.makeText(this, "Locale in Nederlands !", Toast.LENGTH_LONG).show();
            break;

        case 202:

            Locale locale2 = new Locale("fr"); 
            Locale.setDefault(locale2);
            Configuration config2 = new Configuration();
            config2.locale = locale2;
            getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());

            Toast.makeText(this, "Locale en Français !", Toast.LENGTH_LONG).show();
            break;  

        }
        return super.onOptionsItemSelected(item);
    }
}

这是舱单:

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.cousinHub.ChangeLocale"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <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>
        <uses-sdk android:minSdkVersion="3" /> 
    </manifest>

这是我的发现:

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

=>它工作得很好…

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

每次更改区域设置时,菜单都会缩小!!

如果我想让我的应用程序在1.5版本上对用户开放,我应该怎么做??


当前回答

虽然最初的问题并不完全是关于语言环境本身,但所有其他与语言环境相关的问题都指向这个问题。这就是为什么我想在这里澄清这个问题。我使用这个问题作为我自己的语言环境切换代码的起点,并发现该方法并不完全正确。它可以工作,但只有在任何配置改变(例如屏幕旋转),并且只在特定的活动。玩了一段时间的代码,我最终采用了以下方法:

我扩展了android.app.Application,并添加了以下代码:

public class MyApplication extends Application
{
    private Locale locale = null;

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        if (locale != null)
        {
            newConfig.locale = locale;
            Locale.setDefault(locale);
            getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
        }
    }

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

        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);

        Configuration config = getBaseContext().getResources().getConfiguration();

        String lang = settings.getString(getString(R.string.pref_locale), "");
        if (! "".equals(lang) && ! config.locale.getLanguage().equals(lang))
        {
            locale = new Locale(lang);
            Locale.setDefault(locale);
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
        }
    }
}

这段代码确保每个Activity都有自定义区域设置,并且不会在旋转和其他事件时重置。

我还花了很多时间尝试立即应用首选项更改,但没有成功:在Activity重新启动时正确地更改了语言,但直到完全重新启动应用程序才应用数字格式和其他区域属性。

对AndroidManifest.xml的更改

不要忘记添加android:configChanges="layoutDirection|locale"到AndroidManifest的每个活动,以及android:name="。到<application>元素。

其他回答

虽然最初的问题并不完全是关于语言环境本身,但所有其他与语言环境相关的问题都指向这个问题。这就是为什么我想在这里澄清这个问题。我使用这个问题作为我自己的语言环境切换代码的起点,并发现该方法并不完全正确。它可以工作,但只有在任何配置改变(例如屏幕旋转),并且只在特定的活动。玩了一段时间的代码,我最终采用了以下方法:

我扩展了android.app.Application,并添加了以下代码:

public class MyApplication extends Application
{
    private Locale locale = null;

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        super.onConfigurationChanged(newConfig);
        if (locale != null)
        {
            newConfig.locale = locale;
            Locale.setDefault(locale);
            getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
        }
    }

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

        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);

        Configuration config = getBaseContext().getResources().getConfiguration();

        String lang = settings.getString(getString(R.string.pref_locale), "");
        if (! "".equals(lang) && ! config.locale.getLanguage().equals(lang))
        {
            locale = new Locale(lang);
            Locale.setDefault(locale);
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
        }
    }
}

这段代码确保每个Activity都有自定义区域设置,并且不会在旋转和其他事件时重置。

我还花了很多时间尝试立即应用首选项更改,但没有成功:在Activity重新启动时正确地更改了语言,但直到完全重新启动应用程序才应用数字格式和其他区域属性。

对AndroidManifest.xml的更改

不要忘记添加android:configChanges="layoutDirection|locale"到AndroidManifest的每个活动,以及android:name="。到<application>元素。

我不能使用android:anyDensity="true",因为在我的游戏中物体的位置会完全不同……这似乎也有效果:

// creating locale
Locale locale2 = new Locale(loc); 
Locale.setDefault(locale2);
Configuration config2 = new Configuration();
config2.locale = locale2;

// updating locale
mContext.getResources().updateConfiguration(config2, null);

睡了一夜好觉之后,我在网上找到了答案(在下面一行“getBaseContext(). getresources()”上进行简单的谷歌搜索。updateConfiguration(mConfig, getBaseContext().getResources().getDisplayMetrics());"),这里是:

链接文本 =>这个链接还显示了正在发生的事情的截图!

密度是这里的问题,我需要有这个在AndroidManifest.xml

<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true"
/>

最重要的是android:anyDensity =" true "。

不要忘记在AndroidManifest.xml中为每个活动添加以下内容(Android 4.1及以下):

android:configChanges="locale"

当你为Android 4.2 (API级别17)构建时,需要这个版本:

android:configChanges="locale|layoutDirection"

如果您想对菜单选项立即更改区域设置生效。你必须这样做。

//onCreate method calls only once when menu is called first time.
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    //1.Here you can add your  locale settings . 
    //2.Your menu declaration.
}
//This method is called when your menu is opend to again....
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    menu.clear();
    onCreateOptionsMenu(menu);
    return super.onMenuOpened(featureId, menu);
}

这是我对安德烈的回答的评论,但我不能在评论中包含代码。

您的偏好活动是从您的主活动调用的吗?你可以把这个放在简历里…

@Override
protected void onResume() {
    if (!(PreferenceManager.getDefaultSharedPreferences(
            getApplicationContext()).getString("listLanguage", "en")
            .equals(langPreference))) {
        refresh();
    }
    super.onResume();
}

private void refresh() {
    finish();
    Intent myIntent = new Intent(Main.this, Main.class);
    startActivity(myIntent);
}