Làm cách nào để chuyển một biến từ Activity sang Fragment và chuyển nó trở lại?


135

Tôi hiện đang làm một ứng dụng Android và tôi muốn vượt qua một ngày giữa hoạt động và phân đoạn. Hoạt động của tôi có một nút, mở ra đoạn: DatePickerFragment.

Trong hoạt động của tôi, tôi hiển thị một ngày mà tôi muốn sửa đổi với đoạn. Vì vậy, tôi muốn chuyển ngày cho người hẹn hò và gửi lại cho hoạt động.

Tôi đã thử rất nhiều giải pháp, nhưng không có giải pháp nào hiệu quả. Cách dễ dàng sẽ vượt qua một cuộc tranh cãi, nhưng điều này không thể được thực hiện với các mảnh.


Vấn đề của tôi giống hệt như của bạn. Tôi tự hỏi tại sao các ví dụ chỉ coi chính các mảnh đó là "người dùng" của công cụ chọn ngày chứ không phải hoạt động bắt đầu chúng.
Claudio

Câu trả lời:


213

Để truyền thông tin cho một đoạn , bạn đặtArgument khi bạn tạo nó và bạn có thể truy xuất đối số này sau trên phương thức onCreate hoặc onCreateView của đoạn của bạn.

Trên hàm newInstance của đoạn của bạn, bạn thêm các đối số bạn muốn gửi cho nó:

/**
 * Create a new instance of DetailsFragment, initialized to
 * show the text at 'index'.
 */
public static DetailsFragment newInstance(int index) {
    DetailsFragment f = new DetailsFragment();
    // Supply index input as an argument.
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);
    return f;
}

Sau đó, bên trong đoạn trên phương thức onCreatehoặc onCreateViewbạn có thể truy xuất các đối số như thế này:

Bundle args = getArguments();
int index = args.getInt("index", 0);

Nếu bây giờ bạn muốn giao tiếp từ đoạn của bạn với hoạt động của bạn (gửi hoặc không gửi dữ liệu) , bạn cần sử dụng giao diện. Cách bạn có thể làm điều này được giải thích thực sự tốt trong tài liệu hướng dẫn giao tiếp giữa các mảnh. Vì tất cả các đoạn giao tiếp với nhau thông qua hoạt động, trong hướng dẫn này, bạn có thể thấy cách bạn có thể gửi dữ liệu từ đoạn thực tế đến vùng chứa hoạt động của mình để sử dụng dữ liệu này trên hoạt động hoặc gửi nó đến một đoạn khác mà hoạt động của bạn chứa.

Tài liệu hướng dẫn:

http://developer.android.com/training/basics/fragments/cransicating.html


10
Tôi nghĩ rằng quan điểm của những người hỏi câu hỏi này nhiều lần là nó không thực sự được giải thích rõ trong tài liệu này.
Michael Alan Huff

1
Tôi vẫn còn bối rối về phương pháp nào là tốt nhất để sử dụng, phương pháp của bạn hoặc phương pháp dưới đây được trả lời bởi @Elenasys
Yoann Hercouet

Có một cách mới để chia sẻ dữ liệu giữa các đoạn bằng cách sử dụng các thành phần kiến ​​trúc (I / O '17): developer.android.com/topic/lologists/arch
architecture / trộm

Còn những đoạn được tạo bên trong bố cục XML thì sao?
ralphgabb

Tôi không muốn sử dụng phương thức tĩnh nữa.
Ahamadullah Saikat

89

Gửi dữ liệu từ Activityđến mộtFragment

Hoạt động:

Bundle bundle = new Bundle();
String myMessage = "Stackoverflow is cool!";
bundle.putString("message", myMessage );
FragmentClass fragInfo = new FragmentClass();
fragInfo.setArguments(bundle);
transaction.replace(R.id.fragment_single, fragInfo);
transaction.commit();

Miếng:

Đọc giá trị trong đoạn

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    String myValue = this.getArguments().getString("message");
    ...
    ...
    ...
}

Nhưng nếu bạn muốn gửi các giá trị từ Fragment đến Activity, hãy đọc câu trả lời của jpardogo, bạn phải cần giao diện, thông tin thêm: Giao tiếp với các Fragment khác


2
Làm thế nào để vượt qua một đối tượng tùy chỉnh? Tôi đã sử dụng Parcelablenhưng điều đó đã cho tôiclass cast exception
viper

giải pháp này không hiệu quả với tôi, không thể tìm thấy nơi nhập giao dịch từ
thebeancount

Chà, nếu bạn tải Fragment vào Activity, bạn có thể gửi các giá trị thông qua gói được xác định trong giao dịch của mình. Giải thích kịch bản của bạn là gì?
Jorgesys

8

cảm ơn @ ρяσѕρєя K và Terry ... nó giúp tôi rất nhiều và hoạt động hoàn hảo

Từ Hoạt động bạn gửi dữ liệu với mục đích là:

Bundle bundle = new Bundle(); 
bundle.putString("edttext", "From Activity"); 
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

và trong phương thức Fragment onCreateView:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // get arguments
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

tham khảo: Gửi dữ liệu từ hoạt động đến đoạn trong Android


7

Sử dụng thư viện EventBus để truyền sự kiện có thể chứa biến của bạn qua lại. Đó là một giải pháp tốt vì nó giữ cho các hoạt động và các mảnh của bạn được ghép lỏng lẻo

https://github.com/greenrobot/EventBus


4
Tôi không thể nói rằng đây không phải là một giải pháp tốt, nhưng một lời cảnh báo được đưa ra. Mặc dù EventBus rất dễ sử dụng, nhưng đây cũng là mối nguy hiểm của nó. Nếu bạn bắt đầu thêm quá nhiều tín hiệu, tính chất ghép lỏng lẻo có thể khiến việc theo dõi ai gọi ai và nơi diễn ra các sự kiện khác nhau thực sự khó khăn.
Johan Paul

2

Đối với tất cả các nhà phát triển Kotlin ngoài kia:

Dưới đây là giải pháp được đề xuất cho Android Studio để gửi dữ liệu tới Fragment của bạn (= khi bạn tạo một Đoạn trống với Tệp -> Mới -> Đoạn -> Đoạn (Trống) và bạn kiểm tra "bao gồm các phương thức nhà máy phân mảnh").

Đặt cái này vào Fragment của bạn:

class MyFragment: Fragment {

...

    companion object {

            @JvmStatic
            fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
                arguments = Bundle().apply {
                    putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
                }
            }
     }
}

.applylà một mẹo hay để đặt dữ liệu khi một đối tượng được tạo hoặc khi chúng nêu ở đây :

Gọi hàm được chỉ định [khối] với thisgiá trị là bộ thu và trả về thisgiá trị.

Sau đó, trong Hoạt động hoặc Đoạn của bạn làm:

val fragment = MyFragment.newInstance(false)
... // transaction stuff happening here

và đọc các đối số trong đoạn của bạn, chẳng hạn như:

private var isMyBoolean = false

override fun onAttach(context: Context?) {
    super.onAttach(context)
    arguments?.getBoolean("REPLACE WITH A STRING CONSTANT")?.let {
        isMyBoolean = it
    }
}

Để "gửi" dữ liệu trở lại Hoạt động của bạn , chỉ cần xác định một chức năng trong Hoạt động của bạn và thực hiện các thao tác sau trong Đoạn của bạn:

(activity as? YourActivityClass)?.callYourFunctionLikeThis(date) // your function will not be called if your Activity is null or is a different Class

Tận hưởng sự kỳ diệu của Kotlin!


1

Gửi dữ liệu từ Activity vào Fragment được liên kết bởi XML

Nếu bạn tạo một đoạn trong Android Studio bằng một trong các mẫu, ví dụ: Tệp> Mới> Đoạn> Đoạn (Danh sách), thì đoạn đó được liên kết qua XML. Phương thức newInstance được tạo trong đoạn nhưng không bao giờ được gọi vì vậy không thể được sử dụng để truyền đối số.

Thay vào đó, trong Activity ghi đè phương thức trênAttachFragment

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof DetailsFragment) {
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);        
     }
}

Sau đó đọc các đối số trong phương thức onCreate theo các câu trả lời khác


0

Bạn chỉ có thể khởi tạo đoạn của mình bằng một gói:

Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.