Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跨多个活动共享首选项_Java_Android_Android Intent_Android Activity_Sharedpreferences - Fatal编程技术网

Java 跨多个活动共享首选项

Java 跨多个活动共享首选项,java,android,android-intent,android-activity,sharedpreferences,Java,Android,Android Intent,Android Activity,Sharedpreferences,我有一个需要使用共享偏好的项目。我现在只是在尝试共享首选项,所以我不是通过intent传递字符串值,而是通过共享首选项传递它。在我的第一个活动中,我有: SharedPreferences prefs = this.getSharedPreferences("com.example.mayankthakur.personalprojecttrial2", Context.MODE_PRIVATE); Intent nameSave = getIntent(); name = nameSave.

我有一个需要使用共享偏好的项目。我现在只是在尝试共享首选项,所以我不是通过intent传递字符串值,而是通过共享首选项传递它。在我的第一个活动中,我有:

SharedPreferences prefs = this.getSharedPreferences("com.example.mayankthakur.personalprojecttrial2", Context.MODE_PRIVATE);
Intent nameSave = getIntent(); 
name = nameSave.getStringExtra("name") 
prefs.edit().putString(name, "name").apply();
在我的第二个活动中

SharedPreferences preferences = getSharedPreferences("prefs", Context.MODE_PRIVATE);
name = preferences.getString("name", name);
example.setText(name);
现在,我在第二个活动中有一个textview,我想在其中显示string name的值。应用程序没有崩溃,但有一个bug。文本视图不显示字符串名称的值,只显示“name”,不带引号。我查了一下,发现get string方法和put string都需要一个string键。所以我想知道什么是字符串键(这样我以后就不会有这个问题了),以及如何在代码中解决这个问题

第一次活动

 SharedPreferences prefs = this.getSharedPreferences("prefs", Context.MODE_PRIVATE);
prefs.edit().putString(name, "name").apply();
SharedPreferences preferences = getSharedPreferences("prefs", Context.MODE_PRIVATE);
name = preferences.getString("name", "");
example.setText(name);
在第二次活动中

 SharedPreferences prefs = this.getSharedPreferences("prefs", Context.MODE_PRIVATE);
prefs.edit().putString(name, "name").apply();
SharedPreferences preferences = getSharedPreferences("prefs", Context.MODE_PRIVATE);
name = preferences.getString("name", "");
example.setText(name);

你只要把它倒过来就行了。改变

prefs.edit().putString(name, "name").apply();

在共享首选项中,第一个参数是key,第二个参数是value。 当您得到它时,第一个参数是key,第二个参数是默认值,如果第一个参数key值为null

name = preferences.getString("name", "default value");

这里有两个变化

prefs.edit().putString("name", name).apply();
您不必在getstring中写入名称,而必须传递默认值,所以请像这样更改代码

   SharedPreferences preferences = getSharedPreferences("prefs", 
  Context.MODE_PRIVATE);

        example.setText(preferences.getString("name",null);

这将解决您的问题

SharedReferences prefs=this.getSharedReferences(“com.example.mayankthakur.personalprojecttrial2”,Context.MODE\u PRIVATE)

prefs.edit().putString(“name”,name).apply()

看到上面的代码,您需要按照我上面提到的进行更改。不同之处在于,带引号的“name”是键名,而变量名则表示“name”键的值。这将设置您通过共享首选项中“名称”键中的getStringExtra(“名称”)获得的值。

请尝试以下代码:

第一项活动

public static final String MY_PREFS_NAME = "MyPrefsFile";
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
Intent nameSave = getIntent(); 
name = nameSave.getStringExtra("name") 
Log.d("TEST name = "+name);
editor.putString("name", name);
editor.apply();
第二项活动:

public static final String MY_PREFS_NAME = "MyPrefsFile";
SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String name = prefs.getString("name", "No name defined");//"No name defined" is the default value.
Log.d("TEST name = "+name);

你错了,先给关键值,然后给关键值。检查下面

而不是这个

prefs.edit().putString(name, "name").apply();
改为

prefs.edit().putString("name", name).apply();

两个首选项的名称不同。使用相同的名称键用于标识值。例如,在本例中,您将根据
name
存储您的首选项。每当您想从首选项中获取名称值时,都将使用此选项。@您的键用于标识您保存的值。我想你想做的是把名字保存在字段中,名字在键“name”中。在下面检查我的答案,哪个参数是键,哪个是值。put和get方法的键应保持不变。可能的重复是否意味着字符串的default值为null?因为字符串有一个值,而该值是用户在应用程序启动时提供的任何值。你看,用户在应用程序的开头提供了他们的名字,这个名字被分配给字符串变量名,然后使用共享首选项传输。所以这个值不是空的,是吗?不,这意味着如果你不提供任何用户名,它将取空,取而代之,它将取“name”键的值。结果,我不得不将name而不是null作为字符串,因为我注意到第二个参数是传输到textview的参数。我把name写成了一个字符串值,而不是null,它工作得很好!非常感谢!