2011-08-11 32 views
2

第一次打開應用程序並將其存儲在SharedPreferences對象中時,我保存了用戶的用戶名和密碼。我第二次檢查數據時,如果數據不爲空,那麼我就進入了應用程序。下面是我如何做這個:
共享偏好設置android基本問題

private SharedPreferences dhj; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    dhj = this.getSharedPreferences("DHJ", MODE_WORLD_READABLE); 
    if(dhj.getString("username", null) != null) { 
     setContentView(R.layout.main); 
      // do some stuff... 
    } 
    else { 
      setContentView(R.layout.login); 
      username = (EditText) findViewById(R.id.username); 
      password = (EditText) findViewById(R.id.password); 
        loginButton = (Button) findViewById(R.id.loginButton); 

      loginButton.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        SharedPreferences.Editor dhjEditor = dhj.edit(); 
        dhjEditor.putString("username", username.getText().toString()); 
        dhjEditor.putString("password", password.getText().toString()); 
        setContentView(R.layout.main); 
       } 
      }); 
        // do some other stuff... 
    } 
} 

但每次我打開應用程序時,我被要求輸入用戶名和密碼。
我在做什麼錯?我如何實現所需的功能?
謝謝。

+0

您可以發佈密碼和用戶名的代碼嗎? –

+0

你如何在首選項中保存用戶名/密碼? – binnyb

+4

您沒有顯示是否將用戶名和密碼保存到SharedPreferences中。 tbh你的問題可能是你沒有調用.commit(); – Blundell

回答

1

您需要在對首選項進行任何更改之後調用編輯器的commit方法。這將節省的首選項文件:

SharedPreferences.Editor dhjEditor = dhj.edit(); 
dhjEditor.putString("username", username.getText().toString()); 
dhjEditor.putString("password", password.getText().toString()); 
dhjEditor.commit(); 
+0

謝謝。順便說一下,我的代碼用於檢查用戶是否已輸入登錄信息是否正確? – Brahadeesh

+0

看起來不錯,但如果用戶沒有輸入任何內容並點擊登錄按鈕,它將被視爲登錄。空字符串將被保存爲用戶名/密碼。你可能想要在保存前導 – binnyb

+0

之前做一些驗證哦。謝謝。會做到這一點。 – Brahadeesh

2

「getSharedPreferences」 的醫生說:

所需的首選項文件。如果此名稱的首選項文件不存在,則會在您檢索編輯器(SharedPreferences.edit())並提交更改(Editor.commit())時創建它。

確保在提交之前對所有文字使用相同的編輯器,例如,

Editor editor = mPref.edit(); 
editor.putString("username", username); 
editor.putString("password", password); 
editor.commit(); 
3

請注意,editor.commit()函數是執行文件系統操作的同步函數。從主線程(您的代碼似乎在主線程中運行)調用此函數可能 - 在不幸的情況下 - 會拋出一個ANR,因爲文件系統操作可能會停頓,從而阻塞主線程。

我會使用editor.apply()函數,因爲它會立即更新共享首選項的內存中緩存,然後創建工作線程並將值寫入您的共享首選項文件(工作線程不會阻止主線程)。

http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()