Android如何保留登录EditText值并实现已登录用户名自动建议
嘿,这个登录场景的需求太普遍了,我给你拆解成两个部分,一步步来实现,保证清晰好懂~
一、保留登录输入值
这个功能用SharedPreferences就搞定了,它是Android自带的轻量级存储工具,专门存这种小数据,步骤很简单:
- 登录成功后保存用户名:当用户点击登录且验证通过时,把用户名存入SharedPreferences:
// 登录成功后执行这段代码 SharedPreferences loginPrefs = getSharedPreferences("LoginStorage", MODE_PRIVATE); SharedPreferences.Editor editor = loginPrefs.edit(); // 获取输入框的用户名并去除前后空格 String inputUsername = etUsername.getText().toString().trim(); editor.putString("last_login_username", inputUsername); editor.apply(); // 异步保存,比commit()更高效
- 启动Activity时恢复输入值:在LoginActivity的
onCreate()方法里,读取保存的用户名并设置到输入框:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); AutoCompleteTextView etUsername = findViewById(R.id.et_username); // 后面要做自动建议,先换成AutoCompleteTextView // 读取保存的用户名 SharedPreferences loginPrefs = getSharedPreferences("LoginStorage", MODE_PRIVATE); String savedUsername = loginPrefs.getString("last_login_username", ""); etUsername.setText(savedUsername); // 把光标移到文本末尾,体验更好 etUsername.setSelection(savedUsername.length()); }
- 可选:退出登录时清除保存值:如果有退出登录功能,记得把保存的用户名删掉,避免下次启动还显示:
// 退出登录按钮的点击事件里执行 SharedPreferences.Editor editor = getSharedPreferences("LoginStorage", MODE_PRIVATE).edit(); editor.remove("last_login_username"); editor.apply();
二、已登录用户名自动建议
要实现这个功能,我们需要把原来的EditText换成它的子类AutoCompleteTextView(用法和EditText几乎一致,只是多了自动补全能力),然后配合SharedPreferences存储历史用户名列表,步骤如下:
第一步:修改布局文件
把原来的EditText替换成AutoCompleteTextView,设置completionThreshold属性(输入几个字符后显示建议,这里设为1,输入1个字符就触发):
<AutoCompleteTextView android:id="@+id/et_username" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入用户名" android:completionThreshold="1" />
第二步:维护历史用户名列表
每次登录成功后,把当前用户名加入历史列表(要去重,避免重复显示),这里推荐用JSON数组存储(比SharedPreferences的StringSet更灵活,能保持登录顺序):
// 登录成功后执行这段代码,添加到历史列表 SharedPreferences loginPrefs = getSharedPreferences("LoginStorage", MODE_PRIVATE); Gson gson = new Gson(); // 读取已有的历史列表 String historyJson = loginPrefs.getString("username_history", "[]"); List<String> usernameHistory = gson.fromJson(historyJson, new TypeToken<List<String>>() {}.getType()); String inputUsername = etUsername.getText().toString().trim(); // 去重:如果列表里没有当前用户名才添加 if (!usernameHistory.contains(inputUsername)) { // 把最新登录的用户名放在列表最前面 usernameHistory.add(0, inputUsername); // 可选:限制历史列表长度,比如最多存10个 if (usernameHistory.size() > 10) { usernameHistory.remove(usernameHistory.size() - 1); } } // 把更新后的列表存回SharedPreferences String updatedHistoryJson = gson.toJson(usernameHistory); SharedPreferences.Editor editor = loginPrefs.edit(); editor.putString("username_history", updatedHistoryJson); editor.apply(); // 立即更新自动建议的适配器 updateAutoCompleteAdapter();
注意:要使用Gson的话,需要在build.gradle里添加依赖:
implementation 'com.google.code.gson:gson:2.10.1'(版本号可以用最新的)
第三步:设置自动建议适配器
写一个方法来初始化或更新AutoCompleteTextView的适配器,在onCreate()和登录成功后调用:
private void updateAutoCompleteAdapter() { SharedPreferences loginPrefs = getSharedPreferences("LoginStorage", MODE_PRIVATE); Gson gson = new Gson(); String historyJson = loginPrefs.getString("username_history", "[]"); List<String> usernameHistory = gson.fromJson(historyJson, new TypeToken<List<String>>() {}.getType()); // 把列表转换成数组,创建ArrayAdapter String[] usernameArray = usernameHistory.toArray(new String[0]); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, usernameArray); AutoCompleteTextView etUsername = findViewById(R.id.et_username); etUsername.setAdapter(adapter); }
第四步:在onCreate里初始化适配器
回到LoginActivity的onCreate()方法,添加初始化适配器的代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); AutoCompleteTextView etUsername = findViewById(R.id.et_username); // 恢复上次登录的用户名(和第一部分的代码一致) SharedPreferences loginPrefs = getSharedPreferences("LoginStorage", MODE_PRIVATE); String savedUsername = loginPrefs.getString("last_login_username", ""); etUsername.setText(savedUsername); etUsername.setSelection(savedUsername.length()); // 初始化自动建议适配器 updateAutoCompleteAdapter(); }
这样两个功能就都实现啦:每次启动登录页面会自动填充上次的用户名,输入时还会弹出历史登录过的用户名供选择。
内容的提问来源于stack exchange,提问作者stefan.stt
相关产品推荐
相关产品推荐

