在我的应用程序中,我有两个活动,一个可以旋转到两侧,另一个被锁定在横向模式.
figChanges="orientation|screenSize|keyboardHidden">
figChanges="orientation|screenSize|keyboardHidden">
在我的登录活动中使用微调器我正在更改区域设置并更新整个编辑文本和按钮文本.
在按钮单击操作中,我正在更新UI视图,当我旋转设备时,英语区域设置在更新的视图上设置
这是我的整个代码
public class LoginActivity extends Activity
{
Locale locale = null;
Spinner langSpinner;
private SharedPreferences langPrefs;
String langSelected = "";
int langPosition = 0;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.loginscreen);
langPrefs = PreferenceManager.getDefaultSharedPreferences(this);
langSelected = langPrefs.getString(langPrefKey,"");
langPosition = langPrefs.getInt(langPosKey,0);
langSpinner = (Spinner)this.findViewById(R.id.lanuage_spinner1);
langSpinner.setSelection(langPosition);
langSpinner.setonItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView> arg0,View arg1,int pos,long arg3)
{
if (pos == 0)
{
langSelected ="en";
locale = Locale.ENGLISH;
}
else if (pos == 1)
{
langSelected ="it";
locale = Locale.ITALIAN;
}
else if (pos == 2)
{
langSelected ="zh";
locale = Locale.SIMPLIFIED_CHInesE;
}
else if (pos == 3)
{
langSelected ="zh-rTW";
locale = Locale.TradITIONAL_CHInesE;
}
changeLang(langSelected,pos);
}
@Override
public void onnothingSelected(AdapterView> arg0) {
// Todo Auto-generated method stub
}
});
btnLogin = (Button) this.findViewById(R.id.LoginButton);
btnLogin.setonClickListener(new ButtonClickListener());
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onStop() {
super.onStop();
this.finish();
}
@Override
protected void onDestroy()
{
super.onDestroy();
this.finish();
}
public class ButtonClickListener implements OnClickListener {
public void onClick(View v) {
final LoginTask validateTask = new LoginTask(context,usernameField.getText().toString(),passwordField.getText().toString());
validateTask.execute();
}
// Hide the keyboard
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(passwordField.getwindowToken(),0);
}
public class LoginTask extends AsyncTaskarams) {
try
{
return HTTPHelper.LoginTaskData(this.context,username,password);
}
catch (Exception e)
{
exception = e;
Log.e(TAG,"Login Task Error",e);
}
return null;
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
Log.e(TAG,"LoginTask: " + result);
if (result.equals("true"))
{
// moves to next activity
}
else if (result.equals("false"))
{
//showing an alert textview with selected language text
}
}
}
public void changeLang(String lang,int pos)
{
if (lang.length() != 0)
{
saveLocale(lang,pos,locale);
android.content.res.Configuration config = new android.content.res.Configuration();
config.locale = locale;
Locale.setDefault(locale);
getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getdisplayMetrics());
updateTexts();
}
}
public void saveLocale(String lang,Locale locale)
{
SharedPreferences.Editor editor1 = langPrefs.edit();
editor1.remove(langPrefKey);
editor1.remove(langPosKey);
editor1.commit();
SharedPreferences.Editor editor = langPrefs.edit();
editor.putString(langPrefKey,lang);
editor.putInt(langPosKey,pos);
editor.commit();
langSelected = langPrefs.getString(langPrefKey,0);
}
private void updateTexts()
{
// here i will once again set all textview String values,it changes to the selected language
}
@Override
public void onConfigurationChanged(android.content.res.Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (locale != null){
newConfig.locale = locale;
Locale.setDefault(locale);
getBaseContext().getResources().updateConfiguration(newConfig,getBaseContext().getResources().getdisplayMetrics());
}
}
}
最佳答案
如果我理解正确,问题是当你切换屏幕方向时手机的语言环境会恢复,尽管你的AndroidManifest.xml中有android:configChanges =“orientation | screenSize | keyboardHidden”.如果我在你身边,我会从不同的角度来处理这个问题.我会摆脱android:configChanges,当方向改变时,让android重新启动Activity.然后我将使用onSaveInstanceState对来保存用户在Spinner中选择的Locale.再次调用onCreate时,由于方向更改而因为包不为空而调用,因此请读取存储的Locale并重新启动,然后再次更新配置.例如.
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putSerializable("LOCALE",locale);
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loginscreen);
if (savedInstanceState != null) {
locale = (Locale) savedInstanceState.getSerializable("LOCALE");
if (locale != null) {
// update the configuration
}
}