Android App更改语言功能代码错误

时间:2015-09-11 19:48:03

标签: android sharedpreferences

我正在创建一个应用程序,其具有用户选择不同语言的功能,所以我创建了另一个应用程序来测试功能,所以想法是在设置中创建按钮并保存其语言值< / strong>和 onclick 语言更改并使用共享偏好保存其值我的代码中无错误语言未更改。我无法想象那些人任何帮助都表示赞赏。 这里的代码是第一个主要设置

TextView text;
    int language;
    SharedPreferences sh;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text=(TextView)findViewById(R.id.text);
        sh=getSharedPreferences("lang", Context.MODE_PRIVATE);
        language=sh.getInt("language",0);
        Button Lang=(Button)findViewById(R.id.change);
        if(language==0)
        {
            text.setText("Germany");
        }
        else
        if(language==1)
        {
            text.setText("English");
        }
        Lang.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i=new Intent(MainActivity.this,gauravmehra.testastro.Change.class);
                startActivity(i);
            }
        });
    }

更改活动

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.change);
        changeLang=(Button)findViewById(R.id.changeLang);
        sh=getSharedPreferences("lang",Context.MODE_PRIVATE);
        language=sh.getInt("language",0);
        changeLang.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(language==0)
                {
                    language=1;
                    sh.edit().putInt("language",1);
                    sh.edit().commit();
                }
                else if(language==1)
                {
                    language=0;
                    sh.edit().putInt("language",0);
                    sh.edit().commit();
                }
                Intent i=new Intent(Change.this,MainActivity.class);
                startActivity(i);
            }
        });
    }

3 个答案:

答案 0 :(得分:0)

  1. 尝试使用 getApplicationContext()
  2. 尝试使用 Context.MODE_MULTI_PROCESS
  3.   

    getApplicationContext()getSharedPreferences(&#34;朗&#34;,Context.MODE_MULTI_PROCESS)。

    <强>更新
    如果你的api等级> = 23

    您必须在多进程情况下使用 ContentProvider 而不是 SharedPreferences

      

    public static final int MODE_MULTI_PROCESS

    在API级别11中添加 此常量在API级别23中已弃用。
    MODE_MULTI_PROCESS在某些Android版本中无法可靠地工作,而且没有提供任何协调跨进程的并发修改的机制。应用程序不应尝试使用它。相反,他们应该使用明确的跨流程数据管理方法,例如 ContentProvider


    REF:http://developer.android.com/reference/android/content/Context.html#MODE_MULTI_PROCESS

答案 1 :(得分:0)

[EDITED]

你有一个似乎是复制/粘贴的错误。

在“更改活动”中,您有以下两个地方的声明:

                sh.edit().putInt("language",1);

你应该在两个地方都使用它:

                sh.edit().putInt("language", language);

或者,甚至更好:

        public void onClick(View v) {
            language = 1 - language;
            sh.edit().putInt("language", language); 
            sh.edit().commit(); 
            Intent i=new Intent(Change.this,MainActivity.class);
            startActivity(i);
        } 

[OLD ANSWER - 可能仍然可以帮助他人]

调用getSharedPreferences(String name,int mode)时,mode参数确定存储的值是私有的,还是全局可读和/或可写的。

MODE_PRIVATE用于最初存储数据的应用程序。这意味着没有其他应用可以访问该数据。

您应该知道,自API级别17以来,其他两种主要模式已被弃用,因为它们会打开安全漏洞。另外,在API级别23中不推荐使用MODE_MULTI_PROCESS,因为它无法可靠地工作。因此,在应用程序之间使用SharedPreference确实没有好办法。

如果您不需要在应用之间共享数据,则应将两个活动放在同一个应用中。但是,如果2个活动在different processes中,或者您确实需要两个应用程序,那么您应该考虑让第一个应用程序实现ContentProvider或Service来提供共享数据。例如,您可以使用FileProvider

或者,一般情况下,您只需将{2}个应用之间的数据传递给startActivity() {{1}},而且根本不需要使用SharedPreferences。

答案 2 :(得分:0)

我想我弄清楚问题是什么。我已经尝试过上面的解决方案,但我认为上面的方法不能解决这个问题,所以在我之前做过的改变方法

sh.edit().putInt("language",1);
sh.edit().commit();

但是我认为这件事在这里不起作用所以改变了这个

的界限
 Editor editor=sh.edit();
 editor.putInt("language",1);
editor.commit();

并且瞧瞧app现在做得很好。希望它能帮助我成为android的初学者。