【发布时间】:2016-08-17 15:34:57
【问题描述】:
我知道之前问过几个类似的问题,但是尽管按照建议的解决方案进行了所有操作,但我的 sharedPreferences 仍然返回空值。以下是我的代码:
我在 MainActivity 中声明了 2 个静态方法,用于从如下所示的整个应用程序访问 sharedPrefences。
public static void saveToPreferences(Context context, int i,String key) {
mSharedPreferences = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putInt(key , i);
//used in place of commit as it is faster. This does the task asynchronously
editor.commit();
}
public static int readFromPreferences(Context context, int i, String key) {
mSharedPreferences = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
int fed_value = mSharedPreferences.getInt(key, i);
return fed_value;
}
我正在从另一种方法访问这些值,如下所示
static PendingIntent pendingIntent;
static Intent alarmIntent;
int mMinute;
final Calendar calendar = Calendar.getInstance();
int mCurrentHour = calendar.get(calendar.HOUR_OF_DAY);
int mCurrentMinute = calendar.get(calendar.MINUTE);
int minuteDifference;
int mHour;
// Create the TimePicker
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new TimePickerDialog(getActivity(), this, mCurrentHour, mCurrentMinute,
DateFormat.is24HourFormat(getActivity()));
}
@Override
public void onTimeSet(android.widget.TimePicker view, int hourOfDay, int minute) {
mHour = hourOfDay;
minuteDifference = Math.abs(mCurrentMinute - mMinute);
MainActivity.saveToPreferences(getActivity(),minuteDifference,"set_minute");
mMinute = minute;
MainActivity.saveToPreferences(getActivity(), Math.abs(mCurrentHour - mHour), "set_hour");
public int minuteDifference(){
Log.d("tag", String.valueOf(mHour) + " " + String.valueOf(mMinute));
return MainActivity.readFromPreferences(getActivity(),minuteDifference,"set_minute");
}
public int HourDifference(){
return MainActivity.readFromPreferences(getActivity(),Math.abs(mCurrentHour - mHour),"set_hour");
}
方法 minuteDifference 返回 null。它是从一个单独的片段中调用的,如下面的 onStart 方法所示。以下是流程的工作原理:
点击按钮(下面代码块中的 setTime.setOnclickListener(..) )显示 timePicker,然后调用 onTimeSet 方法将数据保存到首选项。
第二个按钮的点击(setAlarm.setOnClickListener(..) 在下面的代码块中)调用方法 minuteDifference 方法,该方法在上面显示的单独片段中定义。
这应该从 sharedPreferences 中读取所需的值并返回它。但它返回 null
@Override
public void onStart() {
super.onStart();
final Button setTime = (Button) getActivity().findViewById(R.id.set_time);
final Button setAlarm = (Button) getActivity().findViewById(R.id.set_alarm);
alarmIntent = new Intent(getActivity(), AlarmReciever.class);
pendingIntent = PendingIntent.getBroadcast(getActivity(), 0, alarmIntent, 0);
setAlarm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlarmManager manager;
TimePickerFragment tfSchedule = new TimePickerFragment();
int mDifferenceMinute = tfSchedule.minuteDifference();
manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
int interval = mDifferenceMinute*60000;
Log.d("minuteDifference",String.valueOf(mDifferenceMinute));
// manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() +
interval, pendingIntent);
}
});
setTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TimePickerFragment tfViewTimer = new TimePickerFragment();
tfViewTimer.show(getFragmentManager(), "Tag");
}
});
}
以下是错误日志
08-17 10:05:47.525 25850-25850/com.rs.rishitshah.feedingnemo E/AndroidRuntime: 致命异常: main 进程:com.rs.rishitshah.feedingnemo,PID:25850 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' 在 com.rs.rishitshah.feedingnemo.MainActivity.readFromPreferences(MainActivity.java:265) 在 com.rs.rishitshah.feedingnemo.TimePickerFragment.minuteDifference(TimePickerFragment.java:63) 在 com.rs.rishitshah.feedingnemo.ScheduleFeed$1.onClick(ScheduleFeed.java:51) 在 android.view.View.performClick(View.java:5204) 在 android.view.View$PerformClick.run(View.java:21155) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5422) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
PS:在将此问题标记为重复或否决此问题之前,请注意我遵循以下链接并且已经按照其中提到的解决方案获得了我的代码。尽管如此,我的代码仍然无法正常工作。
android - sharedpreferences return null value
SharedPreferences getString returns null though set by editor in AsyncTask
SharedPreferences returns null values
Sharedpreferences in Android returns null when called from another activity
【问题讨论】:
-
您的共享偏好没有返回 null。您的上下文为空。
-
谢谢加布。您能否建议为什么会发生这种情况以及解决方法是什么?
标签: java android android-fragments