Android应用程序更改语言功能代码错误

Android应用程序更改语言功能代码错误,android,sharedpreferences,Android,Sharedpreferences,我正在创建一个应用程序,该应用程序具有用户选择不同语言的功能,因此我创建了另一个应用程序来测试其功能性,所以我的想法是在设置中创建按钮并保存其语言值,然后单击语言更改并使用共享的首选项保存其值我的代码中没有错误,但是语言没有改变。我无法计算请伙计们任何帮助都将不胜感激。这里是代码,然后是主设置: TextView text; int language; SharedPreferences sh; @Override protected void onCreate(

我正在创建一个应用程序,该应用程序具有用户选择不同语言的功能,因此我创建了另一个应用程序来测试其功能性,所以我的想法是在设置中创建按钮并保存其语言值,然后单击语言更改并使用共享的首选项保存其值我的代码中没有错误,但是语言没有改变。我无法计算请伙计们任何帮助都将不胜感激。这里是代码,然后是主设置:

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);
            }
        });
    }
  • 尝试使用getApplicationContext()
  • 尝试使用上下文。模式多进程
  • getApplicationContext().GetSharedReferences(“lang”,Context.MODE\u MULTI\u进程)

    更新:
    如果您的api级别>=23

    在多进程情况下,必须使用ContentProvider而不是SharedReferences

    公共静态最终整数模式多进程

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


    参考:

    [编辑]

    您似乎有复制/粘贴错误

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

                    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);
            } 
    
    [旧答案-可能仍会帮助他人]

    调用GetSharedReferences(字符串名,int模式)时,模式参数确定存储的值是私有的,还是全局可读和/或可写的

    最初存储数据的应用程序中使用了模式_PRIVATE。这意味着没有其他应用程序可以访问该数据

    但是,您应该知道,自API级别17以来,其他两种主要模式已被弃用,因为它们打开了安全漏洞。此外,模式\u多\u进程在API级别23中被弃用,因为它不能可靠地工作。因此,在应用程序之间使用SharedReference确实没有什么好方法

    如果你真的不需要在应用程序之间共享数据,你应该将两个活动放在同一个应用程序中。但是,如果这2个活动在或者你真的需要两个应用程序,那么你应该考虑让第一个应用程序实现一个内容提供者或服务来提供共享数据。例如,您可以使用


    或者,一般来说,您可以在传递到
    startActivity()
    时在两个应用程序之间传递数据,而这根本不需要使用SharedReferences。

    我想我知道问题出在哪里了。我已经尝试了以上的解决方案,但我认为上述方法无法解决这个问题,所以在我以前所做的改变方法中

    sh.edit().putInt("language",1);
    sh.edit().commit();
    
    但我认为这东西在这里不起作用,所以用这个改变了路线

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

    瞧,应用程序现在做得很好。希望这对我的android初学者有所帮助。

    模式多线程进程
    在API级别23中被弃用。这也不起作用。我知道它已弃用,我的应用程序目前低于API 23,低于其20,因为目前正在制作语言设置的原型,我更改了代码行sh=getApplicationContext()。GetSharedReferences(“lang”,Context.MODE_MULTI_PROCESS);对于这两个文件。尽管如此,这门语言仍然很流行。它被弃用的原因之一是它并不总是有效的。此外,它也没有尝试以一种好的方式处理来自多个应用程序的并发写入。在API级别11中添加了公共静态final int MODE_MULTI_进程该常量在API级别23中被弃用。MODE_MULTI_进程在某些版本的Android中无法可靠地工作,而且没有提供任何机制来协调进程间的并发修改。应用程序不应尝试使用它。相反,他们应该使用一种明确的跨流程数据管理方法,如ContentProvider。嘿,感谢您回复当前场景,在同一个应用程序中使用此功能,并使用共享首选项,因为当用户从“语言”按钮更改语言时,关闭应用程序后,下次他打开时,语言将是他上次选择的语言如果你在同一个应用程序中的两个活动仍然存在相同的问题,这两个活动是否恰好处于不同的过程中?不,事实上,这种情况就像每次打开应用程序时使用rss提要调用api一样,因此如果用户转到“设置”活动(也有其他内容)并选择“英语”,那么下次他打开应用程序时(我将以编程方式重新启动活动)他将获得英文版的feed,否则feed将来自德国,这是默认设置。就这么简单,请阅读我的代码查看我的更新答案。您似乎有复制/粘贴错误。