2011-08-11 23 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()