我在我的应用程序中一直使用SharedPreferences。
我定义了两种类型的参数。一种叫做:
public static String MISDATOS= "MisDatos";
SharedPreferences prefs2 = getActivity().getSharedPreferences(MISDATOS, Context.MODE_PRIVATE);
和另一个叫做:
public static String MIPACIENTE= "MiPaciente";
SharedPreferences prefs3 = getActivity().getSharedPreferences(MIPACIENTE, Context.MODE_PRIVATE);
在应用程序中,有一连串的碎片,作为一个长的形式工作,由应用程序用户用来介绍几个信息。
我发现了一个让我目前很抓狂的问题。
有Fragment 1,Fragment 2...。碎片10。
为了让我的问题更容易理解,我给大家举个例子。
有一个叫sharepreferences的项目。
Integer hayFotos = prefs3.getInt("hayFotos",0);
遵循顺序,在应用程序启动时,它的值是0。
在Fragment 1第一次运行时,它的值显然是0。
在Fragment 1中,用户拍摄了一张图片或从图库中加载了一张图片,比这个片段将 "hayFotos "的值更新为1。
然后调用Fragment 2。
我已经验证了,在第一次运行Fragment 2时,"hayFotos "的值是1,因为它应该是。
在Fragment 2中,用户拍摄了另一张照片,值更新为2,它工作了。
在Fragment 3,值是2。
在Fragment 4,值是2。
在Fragment 5,数值又是0。
我已经检查了我在每个Fragment都使用了正确的getSharedPreferences键,但在Fragment 4之后的序列中的Fragment失去了 "hayFotos "的值。
我可以把所有代码贴在这里,以证明代码中没有错误,解释了片段4之后 "hayFotos "的值为0,但我想先问你是否有已知的解释,或者这肯定是我的代码中的一个错误。
EDIT:
我把代码和调试器的输出放在这里,以证明我的问题。
片段1的代码
SharedPreferences prefs5 = getActivity().getSharedPreferences("MiPaciente", Context.MODE_PRIVATE);
Integer num_buscado = prefs5.getInt("hayFotos",0);
Log.d("Eva","Eva NE 1 "+num_buscado);
片段1的输出
2020-05-01 16:58:38.076 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 1 0
片段2中的代码。
SharedPreferences prefs5 = getActivity().getSharedPreferences("MiPaciente", Context.MODE_PRIVATE);
Integer num_buscado = prefs5.getInt("hayFotos",0);
Log.d("Eva","Eva NE 2 "+num_buscado);
片段2的输出:
2020-05-01 16:58:38.076 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 1 0
2020-05-01 17:00:21.007 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 2 0
我在片段2中拍了一张照片
片段3中的代码。
SharedPreferences prefs5 = getActivity().getSharedPreferences("MiPaciente", Context.MODE_PRIVATE); Integer num_buscado = prefs5.getInt("hayFotos",0); Log.d("Eva", "Eva NE 3"+num_buscado)。
片段3中的输出。
2020-05-01 16:58:38.076 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 1 0
2020-05-01 17:00:21.007 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 2 0
2020-05-01 17:01:58.273 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 3 1
片段3的输出: 片段4的代码:
SharedPreferences prefs5 = getActivity().getSharedPreferences("MiPaciente", Context.MODE_PRIVATE);
Integer num_buscado = prefs5.getInt("hayFotos",0);
Log.d("Eva","Eva NE 4 "+num_buscado);
片段4的输出:
2020-05-01 16:58:38.076 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 1 0
2020-05-01 17:00:21.007 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 2 0
2020-05-01 17:01:58.273 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 3 1
2020-05-01 17:03:38.238 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 4 1
片段5中的代码
SharedPreferences prefs5 = getActivity().getSharedPreferences("MiPaciente", Context.MODE_PRIVATE);
Integer num_buscadoMiPaciente = prefs5.getInt("hayFotos",0);
Log.d("Eva","Eva NT 1 MiPaciente "+num_buscadoMiPaciente);
SharedPreferences prefs6 = getActivity().getSharedPreferences("MisDatos", Context.MODE_PRIVATE);
Integer num_buscadoMisDatos = prefs6.getInt("hayFotos",0);
Log.d("Eva","Eva NT 1 MisDatos "+num_buscadoMisDatos);
片段5中的代码:
2020-05-01 16:58:38.076 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 1 0
2020-05-01 17:00:21.007 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 2 0
2020-05-01 17:01:58.273 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 3 1
2020-05-01 17:03:38.238 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 4 1
2020-05-01 17:04:59.547 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NE 1 1
2020-05-01 17:04:59.585 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NT 1 MiPaciente 0
2020-05-01 17:04:59.586 11621-11621/com.mpidesarrollo.capenergy D/Eva: Eva NT 1 MisDatos 0
你把你的数据保存在 Activity
语境而非应用语境 更改 getActivity().getSharedPreferences(...)
到 getApplicationContext().getSharedPreferences(..)