在我的应用程序中,当手机处于纵向模式时,可以检索文件名。
当我旋转手机时,正在使用相同的文件来获取首选项,但此特定首选项将显示为空白。
我检查了我写入此首选项的一个函数,但是在旋转手机时没有调用它。
那么,通过旋转手机可能导致sharedpreferences
发生变化的原因是什么?
以下是我使用的代码:
static String retrieveStoredFilename(Context context) {
SharedPreferences myPrefs = context.getSharedPreferences(PREF_NAME,
Context.MODE_PRIVATE);
String s = myPrefs.getString(FILENAME, "");
return TextUtils.isEmpty(s) ? (String) null : s;
}
如果它有帮助,可以使用以下代码。这是来自旋转实际搞砸的片段。 on onResume filename
在旋转后设置为null,但从那时起它就为null,即使我向后旋转也是如此。
@Override
public void onPause() {
super.onPause();
mIV.getBitmap().recycle();
mIV.setImageResource(R.drawable.ic_action_search);
if (myBitMap != null)
myBitMap.recycle();
}
@Override
public void onResume() {
super.onResume();
filename = ControllerFragment.retrieveStoredFilename(getActivity());
getBitmap(filename);
mIV.invalidate();
}
这两个常数是:
public static String FILENAME = "filename";
public static String PREF_NAME = "photobrowser";
答案 0 :(得分:1)
我看到的唯一可能性是FILENAME的值没有被保留。可能值得查看lifecycle of an Activity和Saving Activity state on Android。
以下是关于Configuration Changes的Android文档的一篇文章。
除非您另行指定,否则配置更改(例如更改 在屏幕方向,语言,输入设备等)将导致您的 当前活动将被销毁,正常活动
onPause()
,onStop()
和onDestroy()
的生命周期过程 适当。如果活动位于前景或可见 用户,在该实例中调用onDestroy()
后再新建一个 无论如何都会创建活动的实例 之前实例生成的savedInstanceStateonSaveInstanceState(Bundle)
。
因此,在更改方向后,您的onResume()
永远不会被调用。活动将贯穿整个生命周期onDestroy()
。调整方向更改onCreate()
后,因为它是您活动的新实例。
答案 1 :(得分:1)
检查应用程序的生命周期。你对onCreate(),onPause()等做了什么?也许您正在清除该偏好条目。正如this says:
除非您另行指定,否则配置更改(例如更改 在屏幕方向,语言,输入设备等)将导致您的 当前活动将被销毁,正常活动 onPause(),onStop()和onDestroy()的生命周期过程为 适当。如果活动位于前景或可见 用户,一旦onDestroy()在该实例中被调用,然后是新的 无论如何都会创建活动的实例 之前实例生成的savedInstanceState 的onSaveInstanceState(束)。