2017-04-04 43 views
0

我有一個startActivityForResult返回一個用戶名。 onActivityResult中的此代碼正在返回新的用戶名,如日誌函數返回它的證明。startActivityForResult返回正確的結果,但它變成空

// return user initials from popup 
setUsername(intent.getStringExtra("USERNAME")); 
Log.d("ME", "Username is now :" + getUsername()); //returning the real result 

結果回來MainActivity後,我有一個共享偏好函數從getUsername讀();

SharedPreferences sp = getPreferences(Context.MODE_PRIVATE); 
     setUsername(sp.getString("USERNAME", "")); 

這隻返回""而不是什麼應該被寫入setUsername()。作爲參考,我的方法是:

private void setUsername(String name) { 
    username = name; 
} 

private String getUsername() { 
    return username; 
} 

// called during onDestroy() 
void write() { 
    SharedPreferences.Editor editor = getPreferences(Context.MODE_PRIVATE).edit(); 
    editor.putString("USERNAME", getUsername()); 
    editor.putBoolean("FIRST_RUN", firstRun); 
    editor.apply(); 
} 

// called during onStart() 
void read() { 
    SharedPreferences sp = getPreferences(Context.MODE_PRIVATE); 
    setUsername(sp.getString("USERNAME", "")); 
    firstRun = sp.getBoolean("FIRST_RUN", true); 
} 

而在其他類我寫的用戶名,以共享偏好與此:

private void write() { 
    SharedPreferences.Editor editor = getPreferences(Context.MODE_PRIVATE).edit(); 
    editor.putString("USERNAME", etInitials.getText().toString()); 
    editor.apply(); 
} 
+0

您不會在您向我們顯示的代碼中調用寫入,因此您實際上並未將其置於共享首選項中。 –

+0

編輯澄清何時讀取()和寫入()調用 – DevJem

回答

1
SharedPreferences sp = getPreferences(Context.MODE_PRIVATE); 
    setUsername(sp.getString("USERNAME", "")); 

你一定要明白,第二行是設置一個正確的價值,而不是獲得你設定的名字。

void write() { 
SharedPreferences.Editor editor = getPreferences(Context.MODE_PRIVATE).edit(); 
editor.putString("USERNAME", getUsername()); 
editor.putBoolean("FIRST_RUN", firstRun); 
editor.apply(); 
} 

上述方法需要首先調用,與此intent.getStringExtra("USERNAME")

+0

事情是你沒有調用寫入,所以默認字符串的值總是空的,即你的結果是空的。 – Remario

+0

您最初在設置它之前已經獲得了該值,爲了證明這一點,將該變量聲明爲一個設定值,然後再試一次? – Remario

+0

我在'onStart()'過程中調用'read()'。共享首選項應該在我結束活動時完成。我會嘗試將一個單獨的值,看看是否造成這個缺陷。 – DevJem

1

假設「其他類」被調用的onDestroy期間的寫入方法,在主活性的onActivityResult將首先被稱爲:

OtherActivity >>> onPause 
MainActivity >>> onActivityResult 
MainActivity >>> onRestart 
MainActivity >>> onStart 
MainActivity >>> onResume 
MainActivity >>> onPostResume 
OtherActivity >>> onStop 
OtherActivity >>> onDestroy 
+0

感謝您的操作順序。這澄清了在'onActivityResult'階段寫入首選項的另一個答案。 – DevJem