Activity 和 Fragment 如何通信,请举例说明
在 Android 开发中,Activity 和 Fragment 之间的通信是一个常见的需求。以下是几种常用的通信方式及示例:
这是最常用的方法。Fragment 定义一个接口,Activity 实现这个接口,从而实现通信。
示例代码:
// 定义接口
public class MyFragment extends Fragment {
public interface OnDataPass {
void onDataPass(String data);
}
private OnDataPass dataPasser;
@Override
public void onAttach(Context context) {
super.onAttach(context);
dataPasser = (OnDataPass) context; // 确保 Activity 实现了接口
}
// 当需要传递数据时调用
public void someMethod() {
String data = "Hello from Fragment";
dataPasser.onDataPass(data);
}
}
// 在 Activity 中实现接口
public class MyActivity extends AppCompatActivity implements MyFragment.OnDataPass {
@Override
public void onDataPass(String data) {
// 处理从 Fragment 传来的数据
Log.d("MyActivity", "Received data: " + data);
}
}
ViewModel
如果你使用 Android Architecture Components,可以使用 ViewModel
来共享数据。ViewModel
可以在 Activity 和 Fragment 之间共享。
示例代码:
// 创建 ViewModel
public class SharedViewModel extends ViewModel {
private final MutableLiveData<String> selected = new MutableLiveData<String>();
public void select(String item) {
selected.setValue(item);
}
public LiveData<String> getSelected() {
return selected;
}
}
// 在 Activity 中
public class MyActivity extends AppCompatActivity {
private SharedViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = new ViewModelProvider(this).get(SharedViewModel.class);
}
}
// 在 Fragment 中
public class MyFragment extends Fragment {
private SharedViewModel viewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
viewModel.getSelected().observe(this, item -> {
// 更新 UI
Log.d("MyFragment", "Received data: " + item);
});
}
// 当需要传递数据时调用
public void someMethod() {
viewModel.select("Hello from Fragment");
}
}
LocalBroadcastManager
虽然不太常用,但可以通过 LocalBroadcastManager
发送广播来实现通信。
示例代码:
// 在 Fragment 中发送广播
public class MyFragment extends Fragment {
private void sendBroadcast() {
Intent intent = new Intent("custom-event-name");
intent.putExtra("data", "Hello from Fragment");
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
}
}
// 在 Activity 中接收广播
public class MyActivity extends AppCompatActivity {
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
Log.d("MyActivity", "Received data: " + data);
}
};
@Override
protected void onStart() {
super.onStart();
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, new IntentFilter("custom-event-name"));
}
@Override
protected void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
}
}
以上是 Activity 和 Fragment 之间通信的几种常见方法。选择哪种方法取决于具体的需求和应用架构。使用接口回调和 ViewModel
是最推荐的方式,因为它们更符合 Android 的设计理念和架构。