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

无需启动Activity,从Fragment向宿主Main Activity传递对象

嘿,我看你现在用setIntent()的方式给宿主Activity传数据,这其实是走偏啦😅。这种方式不仅会覆盖掉Activity原本的启动Intent,而且Activity根本不会感知到数据已经更新,肯定达不到你想要的效果。下面给你几种Android官方推荐的、靠谱的实现方式:

方法一:接口回调(最推荐,低耦合易维护)

这是Fragment和宿主Activity通信的标准做法,完全符合Android组件设计的解耦思想。

1. 在Fragment里定义回调接口

// 把这个接口放在你的Fragment类内部或者单独的文件里都可以
public interface OnDataPassListener {
    // 如果要传递自定义对象,直接把参数改成对应的对象类型就行
    void onDataPass(String scanValue);
}

2. 在Fragment中绑定宿主Activity的接口实现

Fragment依附到Activity时,检查宿主是否实现了这个接口,确保通信通道有效:

private OnDataPassListener dataPassListener;

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    try {
        // 强转宿主Activity为接口类型,确保它实现了我们定义的方法
        dataPassListener = (OnDataPassListener) context;
    } catch (ClassCastException e) {
        throw new ClassCastException(context.toString() + " 必须实现OnDataPassListener接口哦");
    }
}

3. Fragment中发送数据

把你原来的sendData()方法改成调用接口的方式:

public void sendData() {
    String scanValue = btSearch.getText().toString();
    // 通过接口把数据传递给宿主Activity
    dataPassListener.onDataPass(scanValue);
}

4. Main Activity实现接口接收数据

让你的UHFMainActivity实现刚才的接口,重写方法处理数据:

public class UHFMainActivity extends AppCompatActivity implements YourFragment.OnDataPassListener {

    // ... 你的其他Activity代码 ...

    @Override
    public void onDataPass(String scanButtonValue) {
        // 在这里处理接收到的数据,比如更新UI或者保存到变量
        String SCAN_BUTTON_VALUE = scanButtonValue;
        // 比如直接更新TextView:textView.setText(SCAN_BUTTON_VALUE);
    }
}

方法二:使用ViewModel(适合复杂场景/配置变化)

如果你的数据需要在屏幕旋转等配置变化后依然保留,或者需要多个Fragment和Activity共享数据,ViewModel是绝佳选择。

1. 创建共享的ViewModel类

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class ScanDataViewModel extends ViewModel {
    // 用LiveData可以自动通知数据变化
    private final MutableLiveData<String> scanValue = new MutableLiveData<>();

    // 设置数据的方法
    public void setScanValue(String value) {
        scanValue.setValue(value);
    }

    // 获取数据观察对象的方法
    public MutableLiveData<String> getScanValue() {
        return scanValue;
    }
}

2. Fragment中发送数据

public void sendData() {
    String scanValue = btSearch.getText().toString();
    // 获取和宿主Activity共享的ViewModel实例
    ScanDataViewModel viewModel = new ViewModelProvider(requireActivity()).get(ScanDataViewModel.class);
    viewModel.setScanValue(scanValue);
}

3. Main Activity中监听数据变化

在Activity的onCreate()方法里观察ViewModel的数据:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ScanDataViewModel viewModel = new ViewModelProvider(this).get(ScanDataViewModel.class);
    // 观察数据变化,一旦有新数据就触发回调
    viewModel.getScanValue().observe(this, scanButtonValue -> {
        // 处理接收到的数据
        String SCAN_BUTTON_VALUE = scanButtonValue;
    });
}

方法三:直接强转Activity实例(不推荐,耦合度高)

虽然这种方式能快速实现,但会让Fragment和Activity紧密绑定,Fragment无法复用在其他Activity中,所以只做了解:

// Fragment中的sendData方法
public void sendData() {
    String scanValue = btSearch.getText().toString();
    // 强转getActivity为你的Main Activity类型,然后调用它的方法
    if (getActivity() instanceof UHFMainActivity) {
        ((UHFMainActivity) getActivity()).receiveData(scanValue);
    }
}

// Main Activity中修改receiveData方法
public void receiveData(String SCAN_BUTTON_VALUE) {
    // 在这里处理数据
}

内容的提问来源于stack exchange,提问作者S. Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:33:51