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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:40:03