Изменение Локали в рамках самого приложения

Мои пользователи могут изменить Локаль в рамках приложения (они могут хотеть сохранить свои настройки телефона на английском языке, но считать содержание моего приложения на французском, нидерландском или любом другом языке...),

Почему это работает превосходное в 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...

Проблема состоит в том, что МЕНЮ "уменьшается" все больше каждый раз, пользователь проходит строки кода выше...

Это - Меню, которое уменьшается:

@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, что я должен сделать??

195
задан JJD 17 March 2014 в 22:01
поделиться

2 ответа

После спокойной ночи сна я нашел ответ в Интернете (простой поиск в Google по следующей строке "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"
61
ответ дан 23 November 2019 в 05:22
поделиться

Я не мог использовать 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);
6
ответ дан 23 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: