0

我一直在研究将首选项与我创建的应用程序一起使用。例如:

我的应用程序的一部分需要倒数计时器。此倒计时计时器的默认值应为 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 *******/

谁能告诉我我做错了什么?

4

1 回答 1

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是一个例外)。

于 2012-12-30T23:43:32.657 回答