android locale更改方向更改

时间:2015-05-08 12:02:17

标签: android configuration orientation locale

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

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

<activity
    android:name="com.hogaming.android.Activities.LoginActivity"
    android:configChanges="orientation|screenSize|keyboardHidden">
</activity>

<activity
    android:name="com.android.activities.MainActivity"
    android:configChanges="orientation|screenSize|keyboardHidden">
</activity>

在我使用微调器的登录活动中我正在更改区域设置并更新整个编辑文本和按钮文本。 在按钮单击操作中,我正在更新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 AsyncTask<Void, Void, String> 
    {
        protected LoginActivity context;
        protected Exception exception;
        private String username;
        private String password;

        public LoginTask(LoginActivity context, String uname, String pwd) {
            this.context = context;
            this.username = uname;
            this.password = pwd;
        }

        @Override
        protected String doInBackground(Void... params) {
            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, int pos, 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, "");
        langPosition = langPrefs.getInt(langPosKey, 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());
        }
    }
}

4 个答案:

答案 0 :(得分:3)

如果我理解正确,问题是当您在android:configChanges="orientation|screenSize|keyboardHidden"中切换屏幕方向(尽管您有AndroidManifest.xml时),手机的区域设置会恢复。如果我在你身边,我会从不同的角度来处理这个问题。当方向发生变化时,我会摆脱android:configChanges,让android重新启动Activity。然后我会使用onSaveInstanceState对来保存Locale中选择的用户Spinner。当再次调用onCreate,并且由于方向更改而因为包不为空而调用时,请读取存储的Locale并重新启动,然后再次更新配置。 E.g。

@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 
        }
    }

答案 1 :(得分:1)

你仍然有解决方案。只需设置已保存的区域设置。在onCreate

    ...
    langPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    langSelected = langPrefs.getString(langPrefKey, "");
    langPosition = langPrefs.getInt(langPosKey, 0);

    // JUST ADD THIS LINE HERE
    changeLang(langSelected, langPosition);  
    // no need to check empty langSelected, it handled inside of changeLang as you write.

    langSpinner = (Spinner)this.findViewById(R.id.lanuage_spinner1);
    ....

您可能需要删除android:configChanges及其相应的方法。

答案 2 :(得分:0)

我认为在清单文件中特定活动的固定方向时,您应该放下以下代码:

clearEmpty()

答案 3 :(得分:0)

只需将其添加到您的活动中

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setlocal();// the code for setting your local
}