SharedPreferences - 初始值来自新应用程序的位置?

时间:2012-12-30 23:39:21

标签: java android

我一直在研究使用我创建的应用程序的偏好设置。例如:

我的应用程序的一部分需要一个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 *******/

有人可以告诉我,我做错了吗?

1 个答案:

答案 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();

我之前可能已经回答了这样的问题,所以一个好的经验法则是:只尝试在方法之外设置原始变量。 intlong甚至String等变量都是安全的。但要注意以大写字母开头的任何数据类型,(String是一个例外)。