วิธีการใช้ setArguments () และ getArguments () เมธอดใน Fragments?


99

ฉันมีชิ้นส่วน 2 ชิ้น: (1) Frag1 (2) Frag2

หอม 1

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();

ฉันจะรับข้อมูลนี้ใน Frag2 ได้อย่างไร

คำตอบ:



192

เพียงโทรตามวิธีgetArguments()ของคุณ:Frag2onCreateView()

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
มันส่งคืนค่าว่างในกรณีของฉันฉันคิดว่าทำไมสิ่งนี้จึงเกิดขึ้น
Anirudh

2
คุณกำลังใส่ArrayListลงในบันเดิล แต่ได้รับ String Array คุณควรทำbundle.getStringArrayList("elist");
Rafał

1
คุณลืมคำสั่ง return:return super.onCreateView(inflater, container, savedInstanceState);
user41805

4
โทร oncreateview ตลอดเวลา. ดังนั้นเรียก getarguments ในเมธอด oncreate () มันจะเรียกเฉพาะเมื่อชิ้นส่วนถูกทำลายหรือเวลาที่สร้างขึ้นใหม่
Mohamed Ibrahim

5
@almaz_from_kazan @HabeebPerwad ทำไมคุณใช้getArguments() ในการonCreateViewไม่ได้อยู่ในonCreate?
Nik Kober

40

เช่น: เพิ่มข้อมูล: -

   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);

เช่นรับข้อมูล: -

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

7

ใน Frag1:

Bundle b = new Bundle();

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

Frag2.setArguments(b);

ใน Frag2:

Bundle b = getArguments();

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

มันง่ายมาก


5

การสร้าง Fragment เป็นวิธีที่ถูกต้อง!

getArguments() setArguments()วิธีการดูเหมือนมีประโยชน์มากในการสร้างอินสแตนซ์ Fragment โดยใช้วิธีคงที่
กล่าวคือMyfragment.createInstance(String msg)

ทำอย่างไร?

รหัสส่วนย่อย

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;
   }

}

สมมติว่าคุณต้องการส่งผ่าน String ในขณะที่สร้างอินสแตนซ์ นี่คือวิธีที่คุณจะทำ

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

อ่านเพิ่มเติม

1) ทำไม Myfragment.getInstance (String msg) จึงเป็นที่ต้องการมากกว่า MyFragment (String msg) ใหม่
2) โค้ดตัวอย่างบน Fragments


android.os.Bundle ไม่มี setString คุณหมายถึง putString ()?
ชิงทรัพย์รับบี

2

สำหรับผู้ที่ต้องการส่งวัตถุอื่นที่ไม่ใช่วัตถุดั้งเดิมเนื่องจากคุณไม่สามารถสร้างตัวสร้างพารามิเตอร์ในส่วนของคุณได้เพียงแค่เพิ่มตัวเข้าถึง setter ในส่วนของคุณสิ่งนี้ใช้ได้กับฉันเสมอ


นั่นเป็นวิธีที่ผิด หากส่วนที่สร้างขึ้นใหม่จะสูญเสียพารามิเตอร์เหล่านั้นไป พารามิเตอร์ที่ส่งไปยังส่วนที่ควรจะเป็น serializable setArguments()ผ่าน พารามิเตอร์ที่ไม่สามารถปรับเปลี่ยนได้สามารถตั้งค่าได้ด้วยตัวตั้งค่า แต่ควรเรียกอีกครั้งเมื่อสร้างกิจกรรม / ส่วนใหม่
CoolMind
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.