我的用户可以在应用程序中更改区域设置(他们可能希望将手机设置保持为英语,但用法语、荷兰语或任何其他语言阅读我的应用程序的内容......)
为什么这在 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 上的用户可以访问我的应用程序,我应该怎么做?
睡了一夜之后,我在网上找到了答案(在下面一行“ getBaseContext().getResources().updateConfiguration(mConfig, getBaseContext().getResources().getDisplayMetrics());”上简单的谷歌搜索),这里是:
getBaseContext().getResources().updateConfiguration(mConfig, getBaseContext().getResources().getDisplayMetrics());
链接文本 => 这个链接还显示screenshots了正在发生的事情!
screenshots
密度是这里的问题 ,我需要在 AndroidManifest.xml 中有这个
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true" />
最重要的是 android:anyDensity =” true “ 。
不要忘记在AndroidManifest.xml每个活动中添加以下内容(适用于 Android 4.1 及更低版本):
AndroidManifest.xml
android:configChanges="locale"
为 Android 4.2(API 级别17)构建时需要此版本,此处说明:
android:configChanges="locale|layoutDirection"