Cách sử dụng phương thức setArguments () và getArguments () trong Fragment?


98

Tôi có 2 mảnh: (1) Frag1 (2) Frag2.

Frag1

bundl = new Bundle();
bundl.putStringArrayList("elist", eList);

Frag2 dv = new Frag2();
dv.setArguments(bundl);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.the_fragg,dv);
ft.show(getFragmentManager().findFragmentById(R.id.the_fragg)); 
ft.addToBackStack(null);
ft.commit();

Làm cách nào để lấy dữ liệu này trong Frag2?

Câu trả lời:


26

Bạn có một phương thức được gọi là getArguments()thuộc về Fragmentlớp.


192

Chỉ cần gọi getArguments()trong của bạn Frag2's onCreateView()phương pháp:

public class Frag2 extends Fragment {

     public View onCreateView(LayoutInflater inflater,
         ViewGroup containerObject,
         Bundle savedInstanceState){
         //here is your arguments
         Bundle bundle=getArguments(); 

        //here is your list array 
        String[] myStrings=bundle.getStringArray("elist");   
     }
}

12
Nó đang trả về null trong trường hợp của tôi, bất kỳ ý tưởng nào tại sao điều này lại xảy ra?
Anirudh

2
Bạn đang đặt ArrayList vào gói, nhưng nhận được Mảng chuỗi. Bạn nên làmbundle.getStringArrayList("elist");
Rafał

1
Bạn quên câu lệnh trả lại:return super.onCreateView(inflater, container, savedInstanceState);
user41805

4
Oncreateview gọi mọi lúc. Vì vậy, chỉ cần gọi getarguments trong phương thức oncreate (). Nó sẽ chỉ gọi khi phân mảnh bị phá hủy hoặc thời gian mới được tạo.
Mohamed Ibrahim

5
@almaz_from_kazan @HabeebPerwad Tại sao bạn sử dụng getArguments() in onCreateView, không sử dụng onCreate?
Nik Kober

38

Vd: Thêm dữ liệu: -

   Bundle bundle = new Bundle();
   bundle.putString("latitude", latitude);
   bundle.putString("longitude", longitude);
   bundle.putString("board_id", board_id);
   MapFragment mapFragment = new MapFragment();
   mapFragment.setArguments(bundle);

Vd: Lấy dữ liệu: -

String latitude =  getArguments().getString("latitude")

7

trong Frag1:

Bundle b = new Bundle();

b.putStringArray("arrayname that use to retrive in frag2",StringArrayObject);

Frag2.setArguments(b);

trong Frag2:

Bundle b = getArguments();

String[] stringArray = b.getStringArray("arrayname that passed in frag1");

Nó đơn giản mà.


5

Khởi tạo Fragment đúng cách!

getArguments() setArguments()các phương thức dường như rất hữu ích khi nói đến việc khởi tạo một Fragment bằng một phương thức tĩnh.
I EMyfragment.createInstance(String msg)

Làm thế nào để làm nó?

Mã phân mảnh

public MyFragment extends Fragment {

    private String displayMsg;
    private TextView text;

    public static MyFragment createInstance(String displayMsg)
    {
        MyFragment fragment = new MyFragment();
        Bundle args = new Bundle();
        args.setString("KEY",displayMsg);
        fragment.setArguments(args);           //set
        return fragment;
    }

    @Override
    public void onCreate(Bundle bundle)
    {
        displayMsg = getArguments().getString("KEY"):    // get 
    }

    @Override
    public View onCreateView(LayoutInlater inflater, ViewGroup parent, Bundle bundle){
        View view = inflater.inflate(R.id.placeholder,parent,false);
        text = (TextView)view.findViewById(R.id.myTextView);
        text.setText(displayMsg)    // show msg
        returm view;
   }

}

Giả sử bạn muốn chuyển một Chuỗi trong khi tạo một Phiên bản. Đây là cách bạn sẽ làm điều đó.

MyFragment.createInstance("This String will be shown in textView");

Đọc thêm

1) Tại sao Myfragment.getInstance (String msg) được ưu tiên hơn MyFragment mới (String msg)?
2) Mã mẫu trên các mảnh


android.os.Bundle không có setString. Ý bạn là putString ()?
Stealth Rabbi,

2

đối với những người như tôi, những người đang tìm cách gửi các đối tượng không phải là nguyên thủy, vì bạn không thể tạo một phương thức khởi tạo tham số hóa trong phân đoạn của mình, chỉ cần thêm một trình truy cập setter vào phân đoạn của bạn, điều này luôn hiệu quả với tôi.


Đó là một cách làm sai lầm. Nếu một phân mảnh được tạo lại, nó sẽ mất các tham số đó. Các tham số được gửi đến phân mảnh phải được nối tiếp hóa, được chuyển qua setArguments(). Các tham số không thể hóa được có thể được đặt bằng setter, nhưng nó phải được gọi lại khi tạo lại hoạt động / phân mảnh.
CoolMind
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.