【问题标题】:android locale change in orientation changeandroid语言环境更改方向更改
【发布时间】:2015-07-19 08:12:09
【问题描述】:

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

以下是添加活动的清单文件详细信息

<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());
        }
    }
}

【问题讨论】:

  • 您使用的是什么 Android 操作系统?
  • 安卓奇巧和棒棒糖

标签: android configuration orientation locale


【解决方案1】:

如果我理解正确,问题是当您切换屏幕方向时手机的区域设置会恢复,尽管您的AndroidManifest.xml 中有android:configChanges="orientation|screenSize|keyboardHidden"。如果我在你身边,我会从不同的角度来处理这个问题。我会摆脱android:configChanges,让android在方向改变时重新启动Activity。然后,我将使用 onSaveInstanceState 对保存和 Locale 用户在 Spinner 中选择的。当onCreate 再次被调用,并且你知道由于bundle 不为空而导致方向改变而被调用时,读取存储的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 
        }
    }

【讨论】:

  • 它应该可以工作,但我不知道为什么它在我的情况下不起作用。我遵循了所有步骤。
【解决方案2】:

您仍然有解决方案。只需设置保存的语言环境。在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及其对应的方法。

【讨论】:

    【解决方案3】:

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

    <activity
         android:name="Your_Activity"
         android:configChanges="orientation"
         android:screenOrientation="landscape" />
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多