2016-05-13 79 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