Android Studio应用视图编辑无法保存,返回设置恢复默认求助
问题
在Android Studio开发的应用中,编辑视图并点击保存后看似成功,但返回设置界面时,修改内容会恢复为默认值。已更新用于拉取数据的Spinner组件,需要实现修改后的设置持久保存,而非恢复默认。
相关代码:
Spinner spinner = findViewById(R.id.CourseSpinner); ArrayAdapter<Course> courseArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, repository.getCourses()); spinner.setAdapter(courseArrayAdapter); for (int i=0; i<repository.getCourses().size();i++) { Course course = repository.getCourses().get(i); if(course.getCourseID() == courseID) { int pos = courseArrayAdapter.getPosition(course); spinner.setSelection(pos); } if (repository.getCourses().get(i).getCourseID() == courseID) spinner.setSelection(i); List<Course> Courses = repository.getCourses(); List<String> CourseName = new ArrayList<>(); for (Course course1 : Courses) { CourseName.add(course.getCourseName()); } } spinner.setAdapter(courseArrayAdapter); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { List<Course> allCourses = repository.getCourses(); editCourseID.setText(String.valueOf(allCourses.get(i).getCourseID())); } // 补充原代码缺失的方法 @Override public void onNothingSelected(AdapterView<?> adapterView) {} });
解决方案
核心问题是没有将用户选择的设置持久化存储,页面重新加载时又回到初始逻辑。以下是修复步骤:
1. 持久化保存选中的CourseID
在保存按钮的点击事件中,将当前Spinner选中的CourseID存入SharedPreferences(适合轻量设置存储):
// 保存按钮点击事件内的代码示例 SharedPreferences prefs = getSharedPreferences("AppSettings", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); // 获取当前选中的课程ID Course selectedCourse = (Course) spinner.getSelectedItem(); editor.putInt("SelectedCourseID", selectedCourse.getCourseID()); editor.apply(); // 异步保存,也可使用commit()同步保存
2. 页面初始化时读取保存的ID并设置Spinner选中项
修改原Spinner初始化代码,读取之前保存的ID直接定位到对应选项,替换冗余循环逻辑:
Spinner spinner = findViewById(R.id.CourseSpinner); List<Course> courseList = repository.getCourses(); ArrayAdapter<Course> courseArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, courseList); spinner.setAdapter(courseArrayAdapter); // 读取保存的选中课程ID,默认值-1表示用户从未选择过 SharedPreferences prefs = getSharedPreferences("AppSettings", MODE_PRIVATE); int savedCourseId = prefs.getInt("SelectedCourseID", -1); // 遍历课程列表设置对应选中项 if (savedCourseId != -1) { for (int i = 0; i < courseList.size(); i++) { if (courseList.get(i).getCourseID() == savedCourseId) { spinner.setSelection(i); break; // 找到匹配项后立即跳出循环,提升效率 } } } spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { Course selectedCourse = courseList.get(i); editCourseID.setText(String.valueOf(selectedCourse.getCourseID())); } @Override public void onNothingSelected(AdapterView<?> adapterView) { // 可选:处理未选中任何项的场景 } });
3. 清理冗余代码
原代码中存在以下无用/重复逻辑,需删除:
- 两次调用
spinner.setAdapter(courseArrayAdapter) - 循环内重复创建
Courses和CourseName列表(未被使用) - 重复的
spinner.setSelection判断逻辑
内容的提问来源于stack exchange,提问作者Rooted Locs
相关产品推荐
相关产品推荐

