2016-05-13 81 views
0
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 _ _" 

编辑:

凡savePrefernces被称为:

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

当负载首叫做:

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

的loadPrefernces被在onBackPressed中调用以检查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)' on null object reference

+0

您的loadPreferences和savePreferences函数是否从同一活动调用? – Elye

+0

为了能够调试我做了两个方法onBackPressed(检查myScore和myWord是否有值)。 LoadPrefernces应该在onCreate上实现,但是当插入到onCreate时它会进入异常(scoreText或wordView为空)。 – NOSMILE

+0

从相同的onPackPressed函数调用?你能显示功能代码吗? – Elye

回答

0
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有两个参数的 “钥匙” 和 “利用DefValue”。通过重新分配“defValue”中的值,我也会得到一个空值,因为我的变量为null。该值必须从第一个参数“key”中检索,如上所示。

0

getPreferences”可以私人访问活动。如果你 “LoadPreferences()” 从其他活动中使用使用 “getSharedPreferences

样品:

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

在用户按下后退按钮并重新输入活动后,LoadPrefernces将在同一活动中调用。 – NOSMILE

+0

您在OnCreate方法中调用''LoadPreferences()'当用户按下后退按钮时,活动仍然存在,用户再次进入后,OnCreate不会调用,为什么在'onPackPressed'中使用'SavePreferences()'?没有按回来按钮可能onDestroy是更好的 –

+0

所以我改变了savePrefernces被称为onDestroy和LoadPrefernces被称为onStart。问题是,当在LoadPrefernces中调用myScore和myWord时为null,但它们在保存时不为null on savePrefernces。 – NOSMILE

0

更改您的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是两个textViews。

+0

仍然不起作用,我重新指定了loadRefernces中的值,如上所示。难道AVD是越野车吗? – NOSMILE