Android:从Activity2向Activity1回传数据的实现困惑
问题分析与解决方案
你现在遇到的核心问题是顺序搞反了:onAddEventClicked里启动Activity2之后,立刻就去创建WeekViewEvent并设置name,但这时候Activity2还没关闭,dataFromActivity2根本还没拿到!startActivityForResult是异步操作,只有当Activity2关闭并返回数据时,onActivityResult才会被调用。
下面是具体的修改步骤和代码:
步骤1:保存需要的参数为成员变量
在BaseActivity里添加两个Calendar类型的成员变量,用来暂存事件的起止时间:
public class BaseActivity extends AppCompatActivity implements WeekView.EventClickListener, MonthLoader.MonthChangeListener, WeekView.EventLongPressListener, WeekView.EmptyViewLongPressListener, WeekView.EmptyViewClickListener, WeekView.AddEventClickListener { // 原有的成员变量... private Calendar mEventStartTime; private Calendar mEventEndTime; // ... }
步骤2:修改onAddEventClicked方法
只负责启动Activity2,把起止时间存起来,不要在这里创建事件:
@Override public void onAddEventClicked(Calendar startTime, Calendar endTime) { // 先保存起止时间,后续创建事件时要用 mEventStartTime = startTime; mEventEndTime = endTime; // 启动Activity2等待用户输入 Intent intent = new Intent(this, Test2.class); startActivityForResult(intent, REQUEST_CODE); }
步骤3:在onActivityResult里创建并添加事件
拿到从Activity2返回的数据后,再创建事件并更新日历视图:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 必须调用父类方法 if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) { String dataFromActivity2 = data.getStringExtra("fav"); // 现在可以创建事件了 WeekViewEvent event = new WeekViewEvent(); event.setId(7); // 注意:如果要添加多个事件,建议用自增ID或UUID避免重复 event.setName(dataFromActivity2); event.setStartTime(mEventStartTime); event.setEndTime(mEventEndTime); event.setColor(getResources().getColor(R.color.event_color_03)); Log.d(TAG, "Intent test:" + dataFromActivity2); mNewEvents.add(event); mWeekView.notifyDatasetChanged(); } }
关于SharedPreferences的疑问
完全不需要用SharedPreferences来替代!startActivityForResult(或者AndroidX推荐的ActivityResultContracts)就是专门用来处理这种临时页面间数据传递场景的。SharedPreferences适合存储需要持久化保存的配置信息(比如用户偏好设置、登录状态),用它来做这种一次性的页面传参反而会增加不必要的复杂度。
另外,你的Activity2代码是没问题的,不用修改~
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

