フラグメントでsetArguments()およびgetArguments()メソッドを使用する方法


98

2つのフラグメントがあります:(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 2013

2
ArrayListをバンドルに入れていますが、文字列配列を取得しています。あなたは行う必要がありますbundle.getStringArrayList("elist");
ラファウ

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 2016年

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()静的メソッドを使用してフラグメントをインスタンス化する場合、メソッドは非常に便利なようです。
すなわち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)が新しいMyFragment(String msg)よりも優先されるのはなぜですか?
2) フラグメントのサンプルコード


android.os.BundleにはsetStringがありません。putString()ですか?
ステルスラビ

2

私のように、プリミティブ以外のオブジェクトを送信しようとしている場合、フラグメントにパラメーター化されたコンストラクターを作成できないため、フラグメントにセッターアクセサーを追加するだけで、これは常に機能します。


それは間違った方法です。フラグメントが再作成される場合、それらのパラメーターは失われます。フラグメントに送信されるパラメーターは、シリアル化可能で、を介して渡される必要がありますsetArguments()。シリアライズ不可能なパラメーターはセッターで設定できますが、アクティビティ/フラグメントの再作成時に再度呼び出す必要があります。
CoolMind 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.