首页 > 解决方案 > 存储用于登录的电子邮件,并在下次登录时显示为电子邮件输入的建议 - Android 应用程序

问题描述

我正在尝试找到一种方法,将用于登录应用程序的所有电子邮件保留在设备中,并在用户尝试登录应用程序时将它们显示为建议或自动完成。

我尝试在登录期间使用共享首选项并将它们存储到 ArrayList 中。但是,每次我登录时,电子邮件都会被最新的登录电子邮件替换,而不是累加。

示例:首先我使用 admin@admin.com 登录并从系统注销。下次登录时会显示 admin@admin.com 建议。但是,如果现在我使用employee@employee.com 登录,则存储的旧电子邮件将被新电子邮件替换。

我首先要做的是在登录后将来自服务器响应的用户电子邮件存储在共享首选项中。

接下来,我将这些数据放入 ArrayList

    SharedPreferences getEmail = getSharedPreferences("userEmail", Context.MODE_PRIVATE);
    String input_email = getEmail.getString("emp_email", "");

    ArrayList<String> userList = new ArrayList<>();
    userList.add(input_email);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, userList);
    if (userList.size() > 0){
        userEmail.setAdapter(adapter);
    }

上面的代码在登录活动的 onCreate 方法里面。我怎样才能做到这一点。我猜这可能不是记住自动建议的电子邮件地址的正确方法。如果是这样,请指出我正确的方向。

谢谢你。

更新

成功登录后在 LoginActivity 中从服务器获取响应

public void getDataForId() {

    SharedPreferences authToken = getSharedPreferences("authToken", Context.MODE_PRIVATE);
    String token = authToken.getString("token", "");

    apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
    Call<UserResponse> call = apiInterface.getData("Bearer " + token);
    call.enqueue(new Callback<UserResponse>() {
        @Override
        public void onResponse(Call<UserResponse> call, Response<UserResponse> response) {

            if (response.isSuccessful()) {

                String emp_email = response.body().getUser().getEmail();

                ArrayList<String> listEmails = getFromPrefs(this);

                if(listEmails == null){
                   listEmails = new ArrayList<>();
                   listEmails.add(emp_email);
                }

                saveToPrefs(this, listEmails);

                /*Log.i("MainActivity", "onCreate: " + getFromPrefs(this).toString());

                if(!listEmails.contains(emp_email)){
                   listEmails.add("b@b.b");
                }

                saveToPrefs(this, listEmails);

                Log.i("MainActivity", "onCreate: " + getFromPrefs(this).toString());*/


            } else {
            }
        }

        @Override
        public void onFailure(Call<UserResponse> call, Throwable t) {
        }
    });
}

请注意,我在变量 **emp_email* 中获取电子邮件(假设您提供的其他两个函数在文件中)。我假设注释掉的部分(在保存第一封电子邮件之后)将在我注销后的 onCreate 方法中开始。

在那里我得到了首选项数据,看到新电子邮件与首选项数据匹配,然后存储它。这是它被替换的时候。

标签: androidarraylistloginsharedpreferences

解决方案


尝试这个。
我已经编辑了你的代码

gist.github.com/adrielAd/b1fbc4f8665183eb195871d21cd415eb

// make listEmails global and also initialise this in onCreate so you get already saved emails when you come to this screen
ArrayList<String> listEmails;

public void getDataForId() {

    SharedPreferences authToken = getSharedPreferences("authToken", Context.MODE_PRIVATE);
    String token = authToken.getString("token", "");

    apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
    Call<UserResponse> call = apiInterface.getData("Bearer " + token);
    call.enqueue(new Callback<UserResponse>() {
        @Override
        public void onResponse(Call<UserResponse> call, Response<UserResponse> response) {

            if (response.isSuccessful()) {

                String emp_email = response.body().getUser().getEmail();

                listEmails = getFromPrefs(this);

                if(listEmails == null){
                   listEmails = new ArrayList<>();
                   listEmails.add(emp_email);
                }else{
                  if(!listEmails.contains(emp_email)){
                     listEmails.add(emp_email);
                  }
                }


                saveToPrefs(this, listEmails);

                /*Log.i("MainActivity", "onCreate: " + getFromPrefs(this).toString());

                if(!listEmails.contains(emp_email)){
                   listEmails.add("b@b.b");
                }

                saveToPrefs(this, listEmails);

                Log.i("MainActivity", "onCreate: " + getFromPrefs(this).toString());*/


            } else {
            }
        }

        @Override
        public void onFailure(Call<UserResponse> call, Throwable t) {
        }
    });
}

推荐阅读