1

アプリにメールを記憶させるためのチェックボックス付きのログインフォームがありますLoginActivity。ログインボタンを押すとSharedPreferences、クラスを使用して電子メールが保存されAppPreferencesます。

ホームボタンを押して戻るとホーム画面に戻ると、アプリはメールを記憶します。

しかし、強制的に閉じると、アプリはPreferencemanager.getString("value", "default_value");メソッドで定義されたデフォルト値を表示します。

私は人々がSOで提案した多くのことを試しましたが、残念ながらどの解決策もうまくいきませんでした。SharedPreferences私はすべてのコードを別のクラスに入れることでそれを解決しようとさえしました(この質問を参照してください)。

以下に、質問に関連するコードをできるだけ多く配置します。したがって、クラスLoginActivityAppPreferences。LogCatからのエラーメッセージはありません。

Android 4.2.2 Cyanogenmod 10.1を搭載したSamsungデバイスI9100とP3110、およびいくつかの異なるエミュレーターの両方で、この問題が発生します。(HoneyCombを搭載したSamsung Sデバイスの一部を読んでSharedPreferencesを正しく保存できませんでしたか?)


編集: 私が言及するのを忘れたように、プロジェクトはAPI17とminSdkVersion=11を対象としています。ログインボタンをクリックしたときにのみ資格情報を保存します。
編集2:この問題は、電話が再起動した場合にも発生します


クラスLoginActivity

public class LoginActivity extends Activity
{
    private static final String PREF_REMEMBER_EMAIL = "LoginCredentialsRememberEmail";
    private static final String PREF_EMAIL = "LoginCredentialsEmail";

    private String mEmail;

    private EditText mEmailView;
    private CheckBox cbRememberEmail;   

    private AppPreferences appPreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        appPreferences = new AppPreferences(LoginActivity.this);

        loadUserCredentials();
    }
    @Override
  protected void onResume() {       
        super.onResume();
        loadUserCredentials();
    }

    @Override
    protected void onStart() {
        super.onStart();
        loadUserCredentials();
    }

    private void loadUserCredentials() {
        String rememberEmail = appPreferences.getPreferenceString(PREF_REMEMBER_EMAIL);
        String email = appPreferences.getPreferenceString(PREF_EMAIL);
        mEmailView = (EditText) findViewById(R.id.email);
        mEmailView.setText((rememberEmail == "1") ? email : "");
        cbRememberEmail = (CheckBox) findViewById(R.id.cbRememberEmail);
        cbRememberEmail.setChecked(rememberEmail == "1" ? true : false);
        mEmail = mPassword = "";
    }
    private void saveUserCredentials() {        
        try {
        String rememberemail = (((CheckBox) findViewById(R.id.cbRememberEmail)).isChecked()) ? "1" : "0";
        appPreferences.setPreferenceString(PREF_REMEMBER_EMAIL, rememberemail);
        String email = (rememberemail == "1") ? mEmail : "";
        appPreferences.setPreferenceString(PREF_EMAIL, email);
    }



    public void cbRememberEmailClick(View view) {
        boolean checked = ((CheckBox) findViewById(R.id.cbRememberEmail)).isChecked();
        if (checked) {
            new AlertDialog.Builder(this).setTitle(R.string.remember_email_notification_title).setMessage(R.string.remember_email_notification_message).setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    ((CheckBox) findViewById(R.id.cbRememberEmail)).setChecked(true);
                }
            }).setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    ((CheckBox) findViewById(R.id.cbRememberEmail)).setChecked(false);
                }
            }).show();
        }
    }
// ...
}

AppPreferencesクラス:

public class AppPreferences {
    Context context;

    private SharedPreferences settings = null;

    private static String LOGIN_CREDENTIALS = "com.example.login.credentials";
    private static String DEFAULT_STRING = "";

    public AppPreferences(Context context) {
        this.context = context;
        settings = PreferenceManager.getDefaultSharedPreferences(context);
    }

    private String getKey(String key) {
        return LOGIN_CREDENTIALS + "." + key;
    }

    public String getPreferenceString(String key) {
        return settings.getString(getKey(key), DEFAULT_STRING);
    }
    public void setPreferenceString(String key, String value) throws Exception {
        SharedPreferences.Editor editor = settings.edit();
        editor.putString(getKey(key), (String) value);
        editor.commit();
    }
// ...
}

どんな助けでも本当にありがたいです、私はこれで何日も立ち往生しています、そしてそれは今本当にイライラしています。

前もって感謝します。

Dediqated

4

4 に答える 4

3

を呼び出すコードは表示されませんsaveUserCredentials。あなたはそれを呼び出す必要がありますonPause

@Override
protected void onPause() {
    super.onPause();
    saveUserCredentials();
}

後のライフサイクルメソッドの1つ(などonDestroy)で呼び出す場合、アプリがバックグラウンドで強制終了された場合は呼び出されません。onStop( Honeycomb以降のみをターゲットにしている場合はこれを延期できます。)

于 2013-03-08T15:46:39.393 に答える
1

またはを含む文字列rememberEmailの代わりにフィールドを変更することで修正しました。なぜこれがうまくいかなかったのかはわかりませんが、11日間の欲求不満の後、これはもう問題ではないという事実に満足しています。Boolean10

また、フォルダ内のすべての設定ファイルを削除しましたか/data/data/com.example/shared_prefs/

で変更されたコードLoginActivity

// ....
private void loadUserCredentials() {
    Boolean rememberEmail = appPreferences.getPreferenceBoolean(PREF_REMEMBER_EMAIL);
    String email = appPreferences.getPreferenceString(PREF_EMAIL);
    mEmailView = (EditText) findViewById(R.id.email);
    mEmailView.setText(rememberEmail ? email : "");
    cbRememberEmail = (CheckBox) findViewById(R.id.cbRememberEmail);
    cbRememberEmail.setChecked(rememberEmail);
}
private void saveUserCredentials() {        
    try {
    Boolean rememberEmail = ((CheckBox) findViewById(R.id.cbRememberEmail)).isChecked();
    appPreferences.setPreferenceBoolean(PREF_REMEMBER_EMAIL, rememberEmail);
    String email = (rememberEmail) ? mEmail : "";
    appPreferences.setPreferenceString(PREF_EMAIL, email);
}
// ....

とでAppPreferences

// ....
private String getKey(String key) {
    key = key.toLowerCase();
    return LOGIN_CREDENTIALS + "." + key;
}
// newly added methods below
public String getPreferenceBoolean(String key) {
    return settings.getBoolean(getKey(key), DEFAULT_BOOLEAN);
}
public void setPreferenceBoolean(String key, Boolean value) throws Exception {
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean(getKey(key), (Boolean) value);
    editor.commit();
}
// ....

私がしたのと同じ間違いをしないことを願っています;)

于 2013-03-19T09:03:15.193 に答える
1

saveメソッドをonDestroyメソッドに入れることをお勧めします

于 2013-03-08T15:45:28.137 に答える
0

チェックボックスがオンになっているときに電話をかけているsaveUserCredentials();場合、これは完全に機能するはずです。また、アプリケーションの開始時に設定objを初期化してみてください。

于 2013-03-11T10:36:58.590 に答える