更改区域设置的应用程序本身 [英] Changing Locale within the app itself
问题描述
我的用户可以在应用程序内更改区域设置(他们可能希望保留自己的手机设置中英文,但看我的应用程序的法语,荷兰语或任何其他语言的内容......)
My users can change the Locale within the app (they may want to keep their phone settings in English but read the content of my app in French, Dutch or any other language ...)
为什么这个工作完全罚款1.5 / 1.6,但不是在2.0了???
Why is this working perfectly fine in 1.5/1.6 but NOT in 2.0 anymore ???
@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...
问题是,菜单中的缩小越来越多,每次用户正在经历一场code线以上...
The problem is that the MENU "shrinks" more and more everytime the user is going through the lines of code above ...
这是被缩水菜单:
@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,使这项工作了吗?
What should I do in API Level 5 to make this work again ?
下面是完整的code。如果要测试的这款:
HERE IS THE FULL CODE IF YOU WANT TO TEST THIS :
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);
}
}
这里是清单:
AND HERE IS THE MANIFEST :
<?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" />
=>它工作得很好...
=> IT WORKS JUST FINE ...
<uses-sdk android:minSdkVersion="3" />
=>菜单收缩每次更改区域!
=> Menu shrinks every time you change the locale !!!
我要保持我的应用以1.5用户访问,我该怎么办?
as I want to keep my application accessible for users on 1.5, what should I do ??
推荐答案
在良好的睡眠晚上,我在网上找到了答案(以下行 getBaseContext一个简单的谷歌搜索() 。.getResources()updateConfiguration(mConfig,getBaseContext()getResources()getDisplayMetrics());
),在这里它是:
After a good night of sleep, I found the answer on the Web (a simple Google search on the following line "getBaseContext().getResources().updateConfiguration(mConfig, getBaseContext().getResources().getDisplayMetrics());
"), here it is :
链接文本
=>这个链接也说明截图
发生了什么事!
link text
=> this link also shows screenshots
of what is happening !
密度为这里的问题,我需要拥有这个在AndroidManifest.xml
Density was the issue here, I needed to have this in the AndroidManifest.xml
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true"
/>
最重要的是机器人:anyDensity =真正的。
不要忘记添加在的AndroidManifest.xml
下面的每个活动(为Android 4.1及以下):
Don't forget to add the following in the AndroidManifest.xml
for every activity (for Android 4.1 and below):
android:configChanges="locale"
当你建立为Android 4.2这个版本需要(API等级17)<一href="http://stackoverflow.com/questions/13856229/onconfigurationchanged-is-not-called-over-jellybean4-2-1">explanation这里:
This version is needed when you build for Android 4.2 (API level 17) explanation here:
android:configChanges="locale|layoutDirection"
这篇关于更改区域设置的应用程序本身的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!