无需启动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
相关产品推荐
相关产品推荐

