我一直在研究使用我创建的应用程序的偏好设置。例如:
我的应用程序的一部分需要一个CountDown计时器。此倒计时器的默认值应为8:00(8分钟或480000毫秒)。但是,我需要用户能够将其更改为他们想要的任何值。
在我的研究过程中,我发现了Android内置的SharedPreferences功能,但我对它的运作方式有点困惑。
我的想法是应用程序将查找共享首选项,如果它们不存在则使用默认值。它似乎没有工作。一旦我安装新的应用程序(目前没有共享首选项XML文件,所以我认为它只会加载默认值,但我得到一个空指针错误,应用程序崩溃。
以下是我的相关代码:
long
msSavedMainClock = 0,
msSavedShotClock = 0,
msShotClockStart,
msMainClockStart;
TextView
tvPeriodPrefix,
tvPeriod;
// Create the SharedPreferences object
SharedPreferences prefs = getSharedPreferences("settings", MODE_PRIVATE);
// Create the Preference Editor object
SharedPreferences.Editor prefsEditor = prefs.edit();
@Override
protected void onCreate(Bundle savedInstanceState) {
/******* more code here *******/
// Load the values/defaults from the SharedPreferences
tvPeriodPrefix.setText( prefs.getString("Period_Prefix", getResources().getString(R.string.period)) );
msMainClockStart = prefs.getLong( "Default_Main_Clock", 480000); // 8 minute default
msShotClockStart = prefs.getLong( "Default_Shot_Clock", 24000); // 24 second default
// Initialize other variables
tvPeriod.setText( tvPeriodPrefix + "1" );
/******* rest of my code here *******/
有人可以告诉我,我做错了吗?
答案 0 :(得分:3)
getSharedPreferences()
需要有效的上下文,因此最早可以运行此代码的是onCreate()
:
// Create the SharedPreferences object
SharedPreferences prefs;
// Create the Preference Editor object
SharedPreferences.Editor prefsEditor;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
prefs = getSharedPreferences("settings", MODE_PRIVATE);
prefsEditor = prefs.edit();
我之前可能已经回答了这样的问题,所以一个好的经验法则是:只尝试在方法之外设置原始变量。 int
,long
甚至String
等变量都是安全的。但要注意以大写字母开头的任何数据类型,(String
是一个例外)。