Fragments에서 setArguments () 및 getArguments () 메서드를 사용하는 방법은 무엇입니까?


98

두 개의 조각이 있습니다 : (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();

Frag2에서이 데이터를 어떻게 얻습니까?

답변:


26

클래스에 getArguments()속하는 라는 메서드가 있습니다 Fragment.


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
제 경우에는 null을 반환합니다. 왜 이런 일이 발생하는지 알 수 있습니까?
Anirudh

2
ArrayList 를 번들에 넣지 만 String Array를 얻습니다. 해야 할 일bundle.getStringArrayList("elist");
Rafał

1
return 문을 잊어 버렸습니다.return super.onCreateView(inflater, container, savedInstanceState);
user41805

4
Oncreateview는 항상 호출합니다. 따라서 oncreate () 메서드에서 getarguments를 호출하기 만하면됩니다. 조각이 파괴되거나 새로 생성 된 시간에만 호출됩니다.
Mohamed Ibrahim

5
@almaz_from_kazan @HabeebPerwad 왜 getArguments() in onCreateView이 아닌 in 을 사용 하고 onCreate있습니까?
Nik Kober

38

예 : 데이터 추가 :-

   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

조각을 올바른 방법으로 인스턴스화하십시오!

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

}

인스턴스를 생성하는 동안 문자열을 전달한다고 가정 해 보겠습니다. 이것이 당신이 할 방법입니다.

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

더 읽어보기

1) 왜 Myfragment.getInstance (String msg)가 new MyFragment (String msg)보다 선호됩니까?
2) 프래그먼트의 샘플 코드


android.os.Bundle에는 setString이 없습니다. putString ()을 의미합니까?
Stealth Rabbi

2

프리미티브 이외의 객체를 보내려는 저와 같은 사람들에게는 프래그먼트에서 매개 변수화 된 생성자를 만들 수 없기 때문에 프래그먼트에 setter 접근자를 추가하면됩니다. 이것은 항상 저에게 효과적입니다.


그것은 잘못된 방법입니다. 조각이 다시 생성되면 해당 매개 변수가 손실됩니다. 프래그먼트로 전송 된 매개 변수는 직렬화 가능해야하며 setArguments(). 직렬화 할 수없는 매개 변수는 setter로 설정할 수 있지만 활동 / 단편 재생성시 다시 호출해야합니다.
CoolMind
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.