我正在创建一个应用程序,其具有用户选择不同语言的功能,所以我创建了另一个应用程序来测试功能,所以想法是在设置中创建按钮并保存其语言值< / 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);
}
});
}
答案 0 :(得分:0)
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的初学者。