Tài liệu Android gợi ý rằng để giao tiếp từ một hoạt động với một đoạn được lưu trữ, đoạn có thể xác định giao diện gọi lại và yêu cầu hoạt động của máy chủ thực hiện nó. Mẫu cơ bản liên quan đến việc triển khai onAttach
trong đoạn của bạn và truyền hoạt động đó sang một đoạn mã gọi lại. Xem http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity.Có thích hợp hơn khi sử dụng Activity.onAttachFragment hoặc Fragment.onAttach để giao tiếp giữa một Hoạt động và một đoạn lồng nhau không?
Dưới đây là ví dụ về việc cung cấp một đoạn dữ liệu khởi tạo nào đó, cũng như nghe một cuộc gọi lại điều hướng.
public class HostActivity extends Activity implements FragmentHost {
@Override
UiModel getUiModel() {
return mUiModel;
}
@Override
FragmentNavListener getNavListener() {
return mNavListener;
}
...
}
public class HostedFragment extends Fragment {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof FragmentHost) {
FragmentHost host = (FragmentHost) activity;
setUiModel(host.getUiModel());
setNavListener(host.getFragmentNavListener());
}
}
...
}
Hãy so sánh này để sử dụng onAttachFragment
trong hoạt động máy chủ để khởi tạo một cách rõ ràng đoạn:
public class HostActivity extends Activity {
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
if (fragment instanceof HostedFragment) {
HostedFragment hostedFragment = ((HostFragment) fragment);
hostedFragment.setUiModel(mUiModel);
hostedFragment.setNavListener(mNavListener);
}
}
...
}
Đối với tôi, nó có vẻ như mô hình đầu tiên có một số nhược điểm:
- Nó làm đoạn khó sử dụng hơn từ các hoạt động khác nhau, kể từ vì tất cả các hoạt động đó phải triển khai giao diện bắt buộc. Tôi có thể tưởng tượng các trường hợp mà một thể hiện phân đoạn đã không yêu cầu được cấu hình đầy đủ bởi hoạt động của máy chủ, nhưng tất cả các hoạt động máy chủ tiềm năng sẽ cần phải thực hiện giao diện máy chủ.
- Điều này làm cho mã hơi khó theo dõi hơn đối với một người không quen với mẫu đang được sử dụng. Việc khởi tạo mảnh trong onFragmentAttached có vẻ dễ theo dõi hơn, vì mã khởi tạo tồn tại trong cùng một lớp tạo ra đoạn.
- Đơn vị kiểm tra bằng cách sử dụng thư viện như Robolectric trở nên khó khăn hơn, vì khi gọi onAttach, bây giờ bạn phải thực hiện FragmentHost thay vì chỉ gọi onAttach (Hoạt động mới().
Đối với những người bạn, những người đã thực hiện hoạt động để giao tiếp đoạn, những gì mô hình để bạn tìm thấy một lợi thế, và tại sao? có hạn chế việc sử dụng onAttachFragment
từ hoạt động chủ?
Otto hiện không còn được dùng nữa – Louis