You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:28:38