Android: проблема в помните меня функциональность входа - PullRequest
0 голосов
/ 02 февраля 2011

У меня есть страница входа с 2 EditText, флажком и кнопкой входа. если я установил флажок «Включено», я хочу сохранить данные, чтобы в следующий раз пользователю не нужно было заполнять эти поля.
у меня есть этот код, но не повезло ..

открытый класс LoginPage extends 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 ]

2 голосов
/ 02 февраля 2011

Я думаю, вы путаете переменные для получения значения пароля пользователя и переменные, которые определяют значения имени пользователя / пароля в настройках. Я думаю , что вы намереваетесь это:

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();
}

Лично я бы так не поступил. Я бы проверил значение флажка, когда пользователь отправил форму, и сохранил только имя пользователя и пароль в этой точке. Что если пользователь снимает флажок, а затем проверяет флажок до того, как введет свой пароль? Вы сохраните пустые значения и будете раздражать своих пользователей.

2 голосов
/ 02 февраля 2011

Эй, пиюш, вы делаете небольшую ошибку в этой части:


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 () всегда будет выдавать falseмой друг bcoz, он не включен в это время.


Вы можете делать такие вещи, как это.


     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
2 голосов
/ 02 февраля 2011

одна вещь, которая как 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 десериализовать при чтении данных. вы можете десериализовать его аналогичным образом ..........

1 голос
/ 02 февраля 2011

Я думаю вам нужно написать / инициализировать эту строку внутри метода 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);
  ...
  }
0 голосов
/ 02 февраля 2011

попробуйте выполнить редактирование построчно .. по крайней мере, в моем случае это удалось ...

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 во время нажатия кнопки входа в систему ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...