【问题标题】:Load Preferences null value加载首选项空值
【发布时间】:2016-05-16 19:09:47
【问题描述】:
private void SavePreferences(){
    try
    {
        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        myScore = ((TextView)findViewById(R.id.score)).getText().toString();
        myWord = ((TextView)findViewById(R.id.word)).getText().toString();
        editor.putString("saveScore", myScore.toString());
        editor.putString("saveWord", myWord.toString());
        editor.commit();
    }
    catch (Exception e) {
        System.err.println("scoreText or wordView are null " + e.getMessage());
    }

}    

private void LoadPreferences(){
    try {
        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
        myScore = ((TextView)findViewById(R.id.score)).getText().toString();
        myWord = ((TextView)findViewById(R.id.word)).getText().toString();
        scoreText.setText(sharedPreferences.getString("saveScore", myScore.toString()));
        wordView.setText(sharedPreferences.getString("saveWord", myWord.toString()));
    }
    catch (Exception e) {
        System.err.println("scoreText or wordView are null " + e.getMessage());
    }
}

scoretext 和 wordView 没有被分配来自 myScore 和 myWord 的值,尽管在调试时它们有一个值。

调试结果:

myScore:"990" scoreText :null
wordView: null myWord"_ _ a _ _"

编辑:

调用 savePreferences 的位置:

@Override
public void onBackPressed() {
    SavePreferences();
    super.onBackPressed();
}

调用加载首选项的位置:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game_avtivity);
    LoadPreferences();
}

在 onBackPressed 中调用 loadPrefernces 以检查 myScore 或 myWord 是否为 null。

当从 onCreate 调用加载首选项时,将调用异常!

错误信息:

第一次调用消息时值仍然为空(预期异常),并且第二次调用该值不应为空(不预期异常)

05-13 17:23:06.671 31547-31547/mt.edu.mcast.guesstheword2 W/System.err:scoreText 或 wordView 为 null 尝试调用虚拟 方法 'void android.widget.TextView.setText(java.lang.CharSequence)' 在空对象引用上

【问题讨论】:

  • 你的 loadPreferences 和 savePreferences 函数是从同一个活动中调用的吗?
  • 为了能够调试,我在BackPressed 上创建了这两种方法。(检查 myScore 和 myWord 是否有值)。 Loadpreferences 应该在 onCreate 中实现,但是当插入到 onCreate 时,它​​会进入异常(scoreText 或 wordView 为空)。
  • 从同一个 onBackPressed 函数调用?可以显示功能码吗?
  • onCreate() 中,您正在加载尚未保存的首选项,因为您将它们保存在onBackPressed() 中。你肯定会得到例外。
  • ofc 我第一次进入活动时会遇到异常,但第二次(当我退后,然后我再次打开活动时)它应该加载这些首选项。

标签: java android android-studio sharedpreferences


【解决方案1】:

getPreferences”拥有对活动的私人访问权限。如果您在另一个活动中使用“LoadPreferences()”,请使用“getSharedPreferences

示例:

SharedPreferences sharedPreferences = getSharedPreferences("YourApp", Context.MODE_PRIVATE);

【讨论】:

  • 在同一个activity中调用LoadPrefernces,在用户按下back press并重新进入activity之后。
  • 您在 OnCreate 方法中调用 '"LoadPreferences()'。当用户按下后退按钮活动仍然存在。用户重新进入后,OnCreate 不会调用。以及为什么在 onBackPressed 中使用 'SavePreferences()' ? 用户无需按返回按钮即可汇总您的活动。也许 onDestroy 更好
  • 所以我将 savePrefernces 更改为 onDestroy 并将 Loadprefernces 更改为 onStart。问题是 myScore 和 myWord 在 LoadPrefernces 上调用时为空,但在 savePrefernces 上保存时它们不为空。
【解决方案2】:

如下改变你的 onCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game_avtivity);
    initailizeView();
    LoadPreferences();
}

protected void initailizeView() {
    scoreText = (TextView)findViewById(R.id.score)
    wordView = (TextView)findViewById(R.id.word)
}

这里我假设 R.id.score 和 R.id.word 是两个 textView。

【讨论】:

  • 还是不行。如上所示,我重新分配了 loadReference 中的值。会不会是 AVD 有问题?
【解决方案3】:
  private void LoadPreferences(){
        try {
            SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
            initailizeView();
            scoreText.setText(sharedPreferences.getString("saveScore", "default"));
            wordView.setText(sharedPreferences.getString("saveWord","default"));
        }
        catch (Exception e) {
            System.err.println("scoreText or wordView are null " + e.getMessage());
        }
}

sharedPreferences.getString 有两个参数“key”和“defValue”。通过重新分配“defValue”中的值,我也会得到一个空值,因为我的变量是空的。该值必须从第一个参数“key”中检索,如上所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2019-10-03
    相关资源
    最近更新 更多