草庐IT

方向变化的android语言环境变化

coder 2023-12-13 原文

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

以下是我的 list 文件详细信息,其中添加了 Activity

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

在我使用微调器的登录 Activity 中,我正在更改语言环境并更新整个编辑文本和按钮文本。 在按钮单击操作中,我正在更新 UI View ,当我旋转设备时,英语语言环境设置在更新的 View 上 这是我的全部代码

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:configChanges="orientation|screenSize|keyboardHidden",在你的 AndroidManifest.xml。如果我在你身边,我会从不同的角度处理这个问题。我会摆脱 android:configChanges,让 android 在方向改变时重新启动 Activity。然后,我将使用 onSaveInstanceState 对来保存用户在 Spinner 中选择的 Locale。当 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 
        }
    }

关于方向变化的android语言环境变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30123357/

有关方向变化的android语言环境变化的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  4. ruby-on-rails - 启用 Rack::Deflater 时 ETag 发生变化 - 2

    在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案

  5. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  6. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  7. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  8. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  9. ruby-on-rails - ruby gem如何在rails环境下工作 - 2

    我试图在rails中了解rubygems是如何变得可以自动使用的,而不是在使用required的文件中gem? 最佳答案 这是通过bundler/setup完成的:http://bundler.io/v1.3/bundler_setup.html.它在您的config/boot.rb文件中是必需的。简而言之,它首先将环境变量设置为指向您的Gemfile:ENV['BUNDLE_GEMFILE']||=File.expand_path('../../Gemfile',__FILE__)然后它通过要求bundler/setup将所有ge

  10. ruby-on-rails - 我需要一个真正的 UNIX RoR 开发环境 - 2

    从一开始,我就是一个Windows高手。我从MS-DOS开始。我安装了Windows2.1以及此后的所有Windows。现在,我家里有10台不同的Windows机器在运行,从Windows7Ultimate到各种版本的WindowsServer。我还没有完成Windows8,也不想去那里。我在服务器和各种软件方面都有UNIX经验,但它并不是我的首选环境。但是,我想我正在转换。我试图假装使用Cygwin和MSYS在Windows下运行UNIX。我的目的是搭建一个开发环境。两者都让我失望了。我花了比开发更多的时间来解决一系列技术问题。这是NotAcceptable。到目前为止,我的Ruby

随机推荐