Hướng dẫn cách truyền dữ liệu giữa hai Fragment

Chào các bạn, chúng ta lại gặp nhau trong loạt bài “Android từ cơ bản cho đến nâng cao rồi” ? Trong bài này, mình sẽ hướng dẫn các bạn cách truyền dữ liệu giữa hai Fragment với nhau nhé! Có nhìu cách để truyền dữ liệu qua lại giữa hai đối tượng này, trong đây mình sẽ đưa ra cách mà mình hay sử dụng nhất: Fragment A -> Activity -> Fragment B.

Hỏi: Sao không truyền thẳng từ Fragment sang Fragment luôn mà đi lòng vòng cho mệt vậy?

Đáp: Vì đối với Fragmet bạn không chắc nó luôn luôn được khởi tạo, ở đây mình lấy ví dụ trên điện thoại và máy tính bảng như hình dưới đây:

Như các bạn có thể thấy, đối với máy tính bảng, Fragment A và B tồn tại song song nhưng ở điện thoại thì không như vậy. Vì vậy chúng ta không chắc ở thời điểm Fragment A tồn tại thì Fragment B có được attach vào Activity chưa -> tránh giao tiếp trực tiếp giữa A và B.

Bước 1: Từ Fragment A -> Activity

Đầu tiên các bạn khai báo một Interface mà các bạn dùng nó để giao tiếp với ActivityFragment đó được attach:

public interface OnFragmentManager() {
     void onDataSelected(String data) // ở đây các bạn truyền dữ liệu cần chuyển qua Fragment kia nhé
}

Trong Fragment A của các bạn khai báo hàm onAttach:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentManager ){
        listener= (OnFragmentManager ) context;
    } else {
        throw new RuntimException(context.toString() + " must implement onViewSelected");
    }
}

Hàm onAttach này sẽ được chạy trước hàm onCreate() nên nó sẽ kiểm tra xem activity của bạn đã implement interface đó chưa, nếu đã implement rồi thì nó sẽ khởi tạo giá trị của biến listener, nếu chưa thì sẽ quăng ra Exception ?

Tiếp đến bạn gọi hàm onDataSelected trong interface và truyền vào giá trị bạn muốn chuyển:

listener.onDataSelected("Android Co ban cho den nang cao");

Và cuối cùng trong Activity và bạn đã implement Interface này trước đó, nó sẽ nhận được giá trị này của Fragment truyền qua

@Override
public void onDataSelected(String data) {
     Log.d("MyActivity","Value: " + data); // chỗ này sẽ có giá trị là "Android Co ban cho den nang cao"
}

Vậy là các bạn đã có thể truyền giá trị từ Fragment sang Activity rồi đấy.

Bước 2: Từ Activity -> Fragment B

Trong hàm onDataSelected các bạn đuợc implement ở Activity, các bạn triển khai như sau

Bundle bundle = new Bundle();
bundle.putString("data", "From Activity");
FragmentB fragmentB = new FragmentB();
fragmentB.setArguments(bundle);

Như vậy dữ liệu đã đuợc truyền qua Fragment B. H chúng ta chỉ cần lấy nó ra ở Fragment B và sử dụng nó.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
     String data = getArguments().getString("data"); // đây là thứ bạn cần :D
     return inflater.inflate(R.layout.fragmentb, container, false);
}

Vậy là chúng ta đã có thể truyền dữ liệu giữa 2 Fragment một cách an toàn nhất rồi đúng không nào. Hẹn gặp lại các bạn tại những bài sau trong series “Android từ cơ bản cho đến nâng cao” nhé.

Nguồn: appConus

Nguyễn Linh

Chia sẻ để cùng tiến bộ...