Fragments'ta setArguments () ve getArguments () yöntemleri nasıl kullanılır?


98

2 parçam var: (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();

Bu verileri Frag2'de nasıl elde ederim?

Yanıtlar:



192

Sadece çağrı getArguments()sizin de Frag2bireyin onCreateView()yönteme:

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
Benim durumumda boş dönüyor, bunun neden olduğuna dair bir fikriniz var mı?
Anirudh

2
ArrayList'i pakete koyuyorsunuz , ancak bir String Array alıyorsunuz. Sen yapmalıyımbundle.getStringArrayList("elist");
Rafal

1
Dönüş ifadesini unuttunuz:return super.onCreateView(inflater, container, savedInstanceState);
user41805

4
Oncreateview araması her zaman. Bu yüzden oncreate () yönteminde getarguments çağırmanız yeterlidir. Yalnızca parça yok edildiğinde veya yeni oluşturulan zaman olduğunda arayacaktır.
Mohamed Ibrahim

5
@almaz_from_kazan @HabeebPerwad Neden getArguments() in onCreateViewdeğil de in kullanıyorsunuz onCreate?
Nik Kober

38

Örneğin: Veri ekle: -

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

Örneğin: Veri alın: -

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

7

Frag1'de:

Bundle b = new Bundle();

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

Frag2.setArguments(b);

Frag2'de:

Bundle b = getArguments();

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

Bu kadar basit.


5

Parçayı doğru şekilde örneklemek!

getArguments() setArguments()yöntemler, statik bir yöntem kullanarak bir Parçayı örneklemek söz konusu olduğunda çok yararlı görünür.
yaniMyfragment.createInstance(String msg)

Nasıl yapılır?

Parça kodu

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

}

Bir Örnek oluştururken bir String geçmek istediğinizi varsayalım. Bunu nasıl yapacaksın.

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

Daha fazla oku

1) Myfragment.getInstance (String msg ) neden yeni MyFragment (String msg) yerine tercih edilir?
2) Parçalar üzerinde örnek kod


android.os.Bundle'da setString yok. PutString () mi demek istediniz?
Stealth Rabbi

2

Benim gibi ilkellerden başka nesneler göndermek isteyenler için, parçanızda parametreleştirilmiş bir kurucu oluşturamayacağınız için, parçanıza bir ayarlayıcı erişimci ekleyin, bu her zaman benim için çalışıyor.


Bu yanlış bir yoldur. Bir parça yeniden oluşursa, bu parametreleri kaybeder. Parçaya gönderilen parametreler serileştirilebilir, geçirilebilir olmalıdır setArguments(). Serileştirilemeyen parametreler ayarlayıcı ile ayarlanabilir, ancak etkinlik / parça yeniden oluşturmada yeniden çağrılmalıdır.
CoolMind
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.