Android:问题记住我登录Activity的功能

时间:2011-02-02 07:02:33

标签: android android-activity

我创建了带有2个EditText和复选框以及登录按钮的登录页面。 如果我将复选框设置为已启用我想保存数据,以便下次用户不需要填写那些字段。
我使用此代码但没有运气..

公共类LoginPage扩展了Activity {

EditText d_ID;
EditText password;
CheckBox cb;
ImageButton ib;

public static final String PREFS_NAME = "MyPrefsFile";
public String PREFS_USER;
public String PREFS__PASS;
String username;
String upass;

SharedPreferences pref

@Override
public void onCreate(Bundle savedInstanceState) {

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.loginpage);

    d_ID = (EditText) findViewById(R.id.dulzuID);
    password = (EditText) findViewById(R.id.dulzuPASS);

    cb = (CheckBox) findViewById(R.id.remember);

    ib = (ImageButton) findViewById(R.id.login);






        pref = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        username = pref.getString(PREFS_USER, null);
        upass = pref.getString(PREFS__PASS, null);
        d_ID.setText(username);
        password.setText(upass);




    ib.setOnClickListener(new OnClickListener() {

        public void onClick(View view) {

            startActivity(new Intent(LoginPage.this, Features.class));
        }
    });

    cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        public void onCheckedChanged(CompoundButton cb1, boolean bln) {

                PREFS_USER = d_ID.getText().toString();//get user name from EditText
                PREFS__PASS = password.getText().toString();//get user Password from EditText
                getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit().putString(PREFS_USER, username).putString(PREFS__PASS, upass).commit();

        }
    });

}

}

任何帮助??

...谢谢

5 个答案:

答案 0 :(得分:2)

嘿piyush你在这部分做了一个小错误:


if (cb.isChecked()) {

    SharedPreferences pref = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
    username = pref.getString(PREFS_USER, null);
    upass = pref.getString(PREFS__PASS, null);
    d_ID.setText(username);
    password.setText(upass);

}

因为每次新活动开始时都会呈现您的视图.cb.isEnabled()将始终给出错误我的朋友bcoz它没有启用它。


你可以像这样做4件事。


     SharedPreferences pref = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
if(!pref.getstring(PREFS_USER,null).equals(null)||!pref.getstring(PREFS_USER,null).equals(""))        
{username = pref.getString(PREFS_USER, null);

        d_ID.setText(username);}
   and same for password field

答案 1 :(得分:2)

有一个像2那样的东西告诉你,当用户点击复选框时不存储值,当用户按下登录按钮时保存它。

如果用户在未输入详细信息时单击该复选框,则将保存空值.......

为什么不对这些对象进行序列化并将其保存为2个内存,并在需要2个内存时再次对其进行去除....

public void serializeCredentials(String Username,String Password) {
            try {
                FileOutputStream fStream = openFileOutput(namefile.bin, Context.MODE_PRIVATE) ;
                ObjectOutputStream oStream = new ObjectOutputStream(fStream);
                oStream.writeObject(Username) ;
                FileOutputStream fos = openFileOutput(passwordfile.bin, Context.MODE_PRIVATE) ;
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(Password) ;
                oStream.flush() ;
                oStream.close() ;
                oos.flush() ;
                oos.close() ;
                Log.v("Serialization success", "Success");
            } catch (Exception e) {

                Log.v("IO Exception", e.getMessage());
            }
            }   

感谢。在阅读数据时不要预先2反序列化。你可以类似地反序列化..........

答案 2 :(得分:2)

我认为您混淆了用于检索用户密码值的变量以及用于标识首选项中用户名/密码值的变量。我你打算这些:

public String PREFS_USER;
public String PREFS__PASS;

是您存储的用户名和密码的标识符,但是您设置它们是您从相应的EditTexts中提取的。我已经为你重写了一些代码:

public static final String PREFS_NAME = "MyPrefsFile";
public static final String PREFS_USER = "prefsUsername";
public static final String PREFS__PASS = "prefsPassword";
...
pref = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
username = pref.getString(PREFS_USER, "");
upass = pref.getString(PREFS__PASS, "");
...
public void onCheckedChanged(CompoundButton cb1, boolean bln) {
    username = d_ID.getText().toString();//get user name from EditText
    upass = password.getText().toString();//get user Password from EditText
    getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit().putString(PREFS_USER, username).putString(PREFS__PASS, upass).commit();
}

就个人而言,我不会这样做。当用户提交表单时我会检查复选框的值,并且只保存用户名和&那时的密码。如果用户取消选中然后重新检查之前>他们输入密码的复选框,该怎么办?您将保存空值并惹恼您的用户。

答案 3 :(得分:1)

我认为你需要在onCreate()方法中编写/初始化这一行。

SharedPreferences pref; 

@Override
public void onCreate(Bundle savedInstanceState) {

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.loginpage);

   pref = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
  ...
  }

答案 4 :(得分:0)

尝试逐行编辑..至少在我的情况下,它做了诀窍..

cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

    public void onCheckedChanged(CompoundButton cb1, boolean bln) {

            PREFS_USER = d_ID.getText().toString();//get user name from EditText
            PREFS__PASS = password.getText().toString();//get user Password from EditText

            SharedPreferences.Editor prefEditor = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit();
            prefEditor.putString(PREFS_USER, username);
            prefEditor.putString(PREFS__PASS, upass);
            prefEditor.commit();
    } 
});

如果您按照N-JOY的建议在登录按钮点击期间触发将数据保存到SharedPreferences会更好..