android locale更改方向更改

在我的应用程序中,我有两个活动,一个可以旋转到两侧,另一个被锁定在横向模式.

以下是我的清单文件详细信息,其中添加了活动

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(AdapterViewnesE;
                }               
                else if (pos == 3)
                {
                    langSelected ="zh-rTW";
                    locale = Locale.TradITIONAL_CHInesE;
                }
                changeLang(langSelected,pos);
            }
            @Override
            public void onnothingSelected(AdapterViewodo 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 
        }
    }

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...