当前位置: 首页 > 知识库问答 >
问题:

正在尝试动态更改Android语言环境

劳宇
2023-03-14

我熟悉Java,但只是学习Android编程。我非常喜欢他们的Hello,LinearLayout示例中的颜色栏,所以我一直在尝试将其扩展为一个可以用于我13个月大的孩子的小程序。我让它显示七种颜色的标签和四行。我想做的一件事(因为我会双语),就是能够动态更改区域设置显示语言,而无需退出应用程序,加载新区域设置,然后再次启动应用程序(这很有效,但很乏味)。因此,七个颜色条的标签适合所选语言,但我希望这些颜色条能够在程序中单击更改,而不是退出程序。换句话说,我真的只想更改应用程序范围内的语言环境,而不是整个手机。

我在这里找到了一些关于区域设置更改的提示,但在这种情况下没有什么是百分之百有效的。我所做的是将微调器代码与布局相结合。我试图将所有内容都保存在一个文件中(目前),以便知道变量和作用域都在工作(我曾尝试像在“官方”Android HelloSpiner代码中一样来回传递东西,但这只会造成混乱)。到目前为止,我为我的定制版HelloLinearLayout编写了以下代码:

感谢任何和所有的建议!哦,我正在构建和测试姜饼,因为那是我的HTC手机运行的。

<代码><代码>

package net.buellnet.hellolinearlayout;

import java.util.Locale;

import android.app.Activity;<br/>
import android.content.res.Configuration;<br/>
import android.os.Bundle;<br/>
import android.view.View;
import android.widget.AdapterView;<br/>
import android.widget.ArrayAdapter;<br/>
import android.widget.Spinner;<br/>
import android.widget.Toast;<br/>

public class HelloLinearLayoutActivity extends Activity {<br/>
    /** Called when the activity is first created. */<br/>
    @Override<br/>
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Spinner spinner = (Spinner) findViewById(R.id.spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                this, R.array.lang_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinner.setAdapter(adapter);
        spinner.setHapticFeedbackEnabled(true);
        spinner.setOnItemSelectedListener(null);
    }

           public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

                String language = parent.getItemAtPosition(pos).toString();
                Configuration newConfig = new Configuration();

                Toast.makeText(parent.getContext(), "The language is " +
                          parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();<br/>
/* I threw the above line in just to see if the control was working. I can change the "language" but the Toast line never pops up, nor does the locale ever change. */

                if (language.equals("English")) {
                    newConfig.locale = Locale.ENGLISH;
                    super.onConfigurationChanged(newConfig);

                    Locale.setDefault(newConfig.locale);
                    getBaseContext().getResources().updateConfiguration(newConfig, getResources().getDisplayMetrics());
                }
                else if (language.equals("French")) {
                    newConfig.locale = Locale.FRENCH;
                    super.onConfigurationChanged(newConfig);

                    Locale.setDefault(newConfig.locale);
                    getBaseContext().getResources().updateConfiguration(newConfig, getResources().getDisplayMetrics());
                }
                else if (language.equals("German")) {
                    newConfig.locale = Locale.GERMAN;
                    super.onConfigurationChanged(newConfig);

                    Locale.setDefault(newConfig.locale);
                    getBaseContext().getResources().updateConfiguration(newConfig, getResources().getDisplayMetrics());
                }
                else if (language.equals("Italian")){
                    newConfig.locale = Locale.ITALIAN;
                    super.onConfigurationChanged(newConfig);

                    Locale.setDefault(newConfig.locale);
                    getBaseContext().getResources().updateConfiguration(newConfig, getResources().getDisplayMetrics());
                }
                else if (language.equals("Portuguese")) {
                    newConfig.locale = new Locale("pt");
                    super.onConfigurationChanged(newConfig);

                    Locale.setDefault(newConfig.locale);
                    getBaseContext().getResources().updateConfiguration(newConfig, getResources().getDisplayMetrics());
                }
                else if (language.equals("Spanish")) {
                    newConfig.locale = new Locale("es");
                    super.onConfigurationChanged(newConfig);

                    Locale.setDefault(newConfig.locale);
                    getBaseContext().getResources().updateConfiguration(newConfig, getResources().getDisplayMetrics());
                }
            }

            public void onNothingSelected(AdapterView parent) {
                  // Do nothing.
            }
}
</code>

共有2个答案

胥宏义
2023-03-14

用这种方式试试!请参阅下面的代码(注意setContentView不再在onCreate方法中):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    doUIStuff();
    //otherThanUILogicGoesHere
}

@Override
public void onResume() {
    super.onResume();
    if (JustModifiedLocale){
        doUIStuff();
    }
}

void doUIStuff(){
    setContentView(R.layout.my_layout);
    //other UI_related necessary initializations go here
}
欧阳哲
2023-03-14
 try updateConfiguration function to set new Locale........


  Resources res = context.getResources();
// Change locale settings in the app.
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.locale = new Locale(language_code.toLowerCase());
res.updateConfiguration(conf, dm);

代替<代码>微调器。setOnItemSelectedListener(null)

1 - public class HelloLinearLayoutActivity extends Activit implements Spinner.OnItemSelectedListener
2- spinner.setOnItemSelectedListener(this);
 类似资料:
  • 我正在开发一个应用程序,使用3种语言的文本。英语、库尔德语和阿拉伯语。我试图在用户更改语言时动态更改布局。我有一个设置屏幕,用户可以在其中更改语言,即我不是在系统设置中更改语言,而是在我的应用程序中更改语言。例如,如果我从库尔德语切换到英语,布局应该从RTL更改为LTR,反之亦然。我尝试使用onConfigUserOnChanged(),但它没有被触发。 更改区域设置:强制活动重新加载资源?找到了

  • 问题内容: 我在Edittext的addTextChangedListener方法中已自定义,一切正常,但是当我更改语言(语言环境)时,我的addTextChangedListener无法正常工作。 我搜索了我的问题并找到了解决方案: 但我不知道如何使用此代码。 问题答案: 您可以尝试先转换为,然后将其投射到

  • 问题内容: 我有一个Action类,我想获取应用程序的语言环境并在此处进行更改,但是我不知道怎么做,也找不到答案。 我可以使用获取当前的语言环境 但是我不知道如何 设置语言环境 。 我想在上述Action类中直接为我的应用更改语言环境。我怎样才能做到这一点? 问题答案: 使用和将其放在HTTP会话中 。

  • 在我的应用程序中,用户应该能够切换区域设置(用于在页面上呈现文本的语言)。大量教程使用FacesContext.get货币实例()。getViewRoot()。setLocale()。例如:http://www.mkyong.com/jsf2/jsf-2-internationalization-example/.但是,这在JSF 2.0中根本不起作用(它在1.2中确实起作用)。这种语言从不切换。

  • 问题内容: 我需要包括两个按钮或链接,以允许用户在英语和西班牙语之间更改语言。我已经阅读了文档并尝试了以下操作: 但是,每次我单击该按钮时,页面都会重新加载,但语言完全不变。我想念什么吗? 注意:我尚未设置,因为我只想以所需的语言重新加载当前页面。 如果我使用文档提供的默认格式,则结果是相同的:页面重新加载,但语言未更改: 更新: 经过进一步测试后,我注意到在和中都使用和都存在问题。目前,我有一个

  • 为应用程序创建多语言支持,可以更改应用程序中的语言设置。 至于现在,一切都适用于英语、西班牙语、法语、俄语,但不适用于印地语和汉语。 1) 我以原始语言指定语言名称,但在应用程序中指定,而不是हिन्दी 我能看到“印地语”。 \res \ values hi \数组。xml 2) 选择“印地语”后结束-实际上选择了默认值(英语) \res\values hi\strings。xml .... 在