Activity与Fragment通信的常用方法及示例

Answered using GPT-4o-mini by Java Q&A Hub

Question:

Activity 和 Fragment 如何通信,请举例说明

Answer:

在 Android 开发中,Activity 和 Fragment 之间的通信是一个常见的需求。以下是几种常用的通信方式及示例:

1. 使用接口回调

这是最常用的方法。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);
    }
}

2. 使用 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");
    }
}

3. 使用 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 的设计理念和架构。