如何按每日顺序获取strings.xml数组值并每日更新文本框内容?
问题解决:每日依次从数组取文本并更新
你的核心问题是当前代码用随机索引选文本,且未保存当前索引状态,导致无法按顺序每日切换下一个数组元素。以下是修正方案:
问题分析
- 现有代码使用
Random()随机获取索引,不符合「依次取值」的需求 - 仅保存文本内容而非当前索引,无法追踪下一个要显示的元素位置
- 日期判断逻辑错误:
Calendar.DAY_OF_YEAR是一年中的第几天(1-366),0<=timeOfDay<24的条件无意义
修正方案
我们需要通过SharedPreferences保存当前使用的数组索引和最后更新的日期,每日切换时递增索引(超出数组长度则循环)。
修改后的Java代码
mTestArray = getResources().getStringArray(R.array.morning); SharedPreferences prefs = this.getSharedPreferences("DAILY_GREETINGS", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); // 获取当前日期(格式化为yyyy-MM-dd,确保每日唯一) SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); String currentDate = dateFormat.format(new Date()); // 获取存储的状态 int currentIndex = prefs.getInt("CURRENT_INDEX", 0); String lastUpdateDate = prefs.getString("LAST_UPDATE_DATE", ""); boolean isFirstRun = prefs.getBoolean("IS_FIRST_RUN", true); if (isFirstRun) { // 首次运行:显示第一个元素,初始化状态 dailyGreetings.setText(mTestArray[0]); editor.putInt("CURRENT_INDEX", 0); editor.putString("LAST_UPDATE_DATE", currentDate); editor.putBoolean("IS_FIRST_RUN", false); editor.apply(); } else { if (!currentDate.equals(lastUpdateDate)) { // 日期已变:计算下一个索引,循环遍历数组 currentIndex = (currentIndex + 1) % mTestArray.length; dailyGreetings.setText(mTestArray[currentIndex]); // 更新存储的索引和日期 editor.putInt("CURRENT_INDEX", currentIndex); editor.putString("LAST_UPDATE_DATE", currentDate); editor.apply(); } else { // 当日重复打开:显示当前索引对应的文本 dailyGreetings.setText(mTestArray[currentIndex]); } }
说明
- 用
CURRENT_INDEX跟踪当前显示的数组元素位置,每日递增后取模数组长度实现循环 - 用
LAST_UPDATE_DATE(格式化为yyyy-MM-dd)判断是否需要更新文本 - 统一使用一个
SharedPreferences实例管理所有状态,避免多个实例的混乱 - 去掉了无意义的
DAY_OF_YEAR判断,直接通过日期字符串对比判断是否跨日
strings.xml无需修改,保持原数组即可。
内容的提问来源于stack exchange,提问作者Latife Turan
相关产品推荐
相关产品推荐

