0

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

我在这里找到了一些关于区域设置更改的提示,但在这种情况下没有任何 100% 有效。我所做的是将 Spinner 代码与布局结合起来。我正在尝试将所有内容保存在一个文件中(暂时),以便我知道变量和范围都在工作(我曾尝试像在“官方”Android HelloSpinner 代码中那样来回传递东西,但这没有任何作用但一团糟)。到目前为止,这是我为自定义版本的 HelloLinearLayout 编写的代码:

任何和所有的建议表示赞赏!哦,我正在针对 Gingerbread 进行构建和测试,因为这就是我的 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>
4

2 回答 2

0

试试这个方法!请参见下面的代码(请注意 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
}
于 2012-10-30T20:53:59.607 回答
0
 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);

代替 spinner.setOnItemSelectedListener(null);

1 - public class HelloLinearLayoutActivity extends Activit implements Spinner.OnItemSelectedListener
2- spinner.setOnItemSelectedListener(this);
于 2012-06-15T21:34:05.797 回答