Android'de etkinlikten parçaya veri gönderme


316

İki dersim var. Birincisi faaliyet, ikincisi biraz sahip olduğum bir parçadır EditText. Aktivitede async-görevli bir alt sınıfım var ve yöntemde doInBackgrounddeğişkene kaydettiğim bazı sonuçlar elde ediyorum. Bu değişkeni "benim etkinliğim" alt sınıfından bu parçaya nasıl gönderebilirim?

Yanıtlar:


662

Etkinlik'ten şu şekilde veri gönderirsiniz:

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

ve Fragment onCreateView yönteminde:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

15
bir nesneyi parçaya geçirebilir misin?
yeahman

63
Hmm Arama yaparken bir NullPointerException alıyorumgetArguments().getString(key)
Nima G

9
NullPointerException "Dize strtext setArguments (). GetString (" edttext ");"
Jorgesys

4
Paket içeriğini parça halinde okurken her zaman önce getArguments yöntemini kullanarak paketi bir Bundle nesnesine alın ve null'a karşı kontrol edin. Aksi takdirde, getString yöntemi null değerine uygulanır ve böylece hiçbir paket geçirilmediğinde NPE uygulanır. Bu, paket iletilmediğinde boş işaretçi istisnalarını önler.
balachandarkm

3
@Aznix. Parça için yapıcı oluşturulması önerilmez.
Azam

108

Ayrıca aktivite verilerine parçadan erişebilirsiniz:

Aktivite:

public class MyActivity extends Activity {

    private String myString = "hello";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        ...
    }

    public String getMyData() {
        return myString;
    }
}

Fragment:

public class MyFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        MyActivity activity = (MyActivity) getActivity();
        String myDataFromActivity = activity.getMyData();
        return view;
    }
}

78
Bu çözüm, faaliyetiniz ve Fragment arasındaki sıkı bağlantıyı entegre eder, Bundlebilgiyi aktarmak için sınıfı kullanmak daha iyidir . Alternatif olarak, bu getMyData()yöntemi bir arabirimden devralındı ​​ve uygulandı ve FragmentgetActivity'nin bir instanceofArabirim döndürüp döndürmediğini kontrol edebilirsiniz onAttach().
Rudi Kershaw

1
Bu çözüm benim için en iyisi. Ayrıca myString herkese açıksa, getMyData () yöntemini bildirmediniz
Burak Öztürk

1
Kabul edilen geçerli cevap boş gösterici istisnası döndürüyor. Kabul edilen cevap bu olmalı
Richmond

9
Bu gerektiğini değil kabul cevap. Sıkı bağlantı kolayca önlenebilir. Bu genellikle kötü bir fikirdir ve parçayı işe yaramaz hale getirir, sadece bir etkinliğe bağlı olarak kullanacaksanız bir parçasına sahip olmayabilir. Parça başka etkinliklerde tekrar kullanılamaz.
Martin Marconcini

51

Burada @ stackoverflow.com bir sürü cevap buldum ama kesinlikle bu doğru cevap:

Msgstr "Faaliyetten parçaya android veri gönderme".

Aktivite:

        Bundle bundle = new Bundle();
        String myMessage = "Stackoverflow is cool!";
        bundle.putString("message", myMessage );
        FragmentClass fragInfo = new FragmentClass();
        fragInfo.setArguments(bundle);
        transaction.replace(R.id.fragment_single, fragInfo);
        transaction.commit();

Fragment:

Parçadaki değeri okuma

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Bundle bundle = this.getArguments();
        String myValue = bundle.getString("message");
        ...
        ...
        ...
        }

ya da sadece

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
        }

Sanırım bu bir Fragment içinde iç içe bir ListView onQueryTextSubmit-arama-sonuçlarını güncellemek için en iyi yaklaşım değil (birisi hızlı yazıyorsa, o saniyede iki kez argümanlar göndereceğiz)?
Martin Pfeffer

1
Dize veya int içine yerleştirilmiş nesne ne olacak?
Dario

2
@Jorgesys Bu çözüm ne olacak? developer.android.com/training/basics/fragments/…
yozhik

23

Bu cevap çok geç olabilir. ancak gelecekteki okuyucular için yararlı olacaktır.

Bazı kriterlerim var. Dosyayı niyetten almak için kodladım. ve daha sonraki işlemler için belirli bir parçaya aktarılacak seçilmiş dosya. i Dosya toplama işlevselliğine sahip birçok parçaları var. zaman, her zaman durumu kontrol ve parça almak ve geçmek değeri oldukça iğrenç. yani, ben arayüzü kullanarak değeri geçmeye karar verdik.

Adım 1: Ana Faaliyette arayüzü oluşturun.

   public interface SelectedBundle {
    void onBundleSelect(Bundle bundle);
   }

Adım 2: Aynı Etkinlikte SelectedBundle başvurusunu oluşturma

   SelectedBundle selectedBundle;

3.Adım: Yöntemi Aynı Etkinlikte Oluşturma

   public void setOnBundleSelected(SelectedBundle selectedBundle) {
       this.selectedBundle = selectedBundle;
   }

Adım 4: Tüm parçaların dosya seçici işlevselliğine sahip olan SelectedBundle referansını başlatması gerekiyor. Bu kodu parça onCreateView(..)yönteminize yerleştiriyorsunuz

    ((MainActivity)getActivity()).setOnBundleSelected(new MainActivity.SelectedBundle() {
          @Override
         public void onBundleSelect(Bundle bundle) {
            updateList(bundle);
        }
     });

Adım 5: Benim durumum, HomeActivity'den parçaya resim Uri'yi geçirmem gerekiyor. Yani, bu işlevi onActivityResult yönteminde kullandım.

onActivityResult MainActivity'den gelen değerleri, arabirimi kullanarak parçalara iletin.

Not: Durumunuz farklı olabilir. bunu HomeActivity'nizden herhangi bir yerden arayabilirsiniz.

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent  data) {
       selectedBundle.onBundleSelect(bundle);
  }

Bu kadar. İhtiyacınız olan her parçayı FragmentClass'ta uygulayın. Harikasın. yaptın. VAY...


15

Fragmanları (F) kullanmanın temel fikri, android uygulamalarında yeniden kullanılabilir kendi kendini sürdüren UI bileşenleri oluşturmaktır. Bu Fragmanlar aktivitelerde yer alır ve A -> F ve FA'dan iletişim yolu yolları oluşturmanın ortak (en iyi) yolu vardır, Bir FF arasında bir Aktivite aracılığıyla İletişim kurmak şarttır, çünkü o zaman sadece Fragmanlar ayrıştırılır ve kendi kendine devam eder.

Bu yüzden A -> F'den veri aktarımı ρяσѕρєя K tarafından açıklananla aynı olacaktır. Bu cevaba ek olarak, bir Aktivite içinde Fragmanlar oluşturulduktan sonra, Fragmanlarda metot çağıran fragmanlara da veri aktarabiliriz.

Örneğin:

    ArticleFragment articleFrag = (ArticleFragment)
                    getSupportFragmentManager().findFragmentById(R.id.article_fragment);
    articleFrag.updateArticleView(position);


15

En iyi ve kullanışlı yaklaşım, parça örneğini çağırmak ve o sırada veri göndermek. varsayılan olarak her parçanın örnek yöntemi vardır

Örneğin: parça adınız MyFragment ise

böylece parçanızı şöyle bir etkinlikten arayacaksınız:

getSupportFragmentManager().beginTransaction().add(R.id.container, MyFragment.newInstance("data1","data2"),"MyFragment").commit();

* R.id.container FrameLayout'umun kimliği

böylece MyFragment.newInstance ("data1", "data2") parçasına veri gönderebilirsiniz ve parçanızda bu verileri MyFragment newInstance (String param1, String param2) içinde alabilirsiniz

public static MyFragment newInstance(String param1, String param2) {
        MyFragment fragment = new MyFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

ve sonra onCreate parça yönteminde verileri alırsınız:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

şimdi mParam1 veri1 ve mParam2 veri2 var

şimdi bu mParam1 ve mParam2'yi parçanızda kullanabilirsiniz .


burada R.id.container nedir? R.id.container_current mı demek istediniz?
shaurya uppal

@s * R.id.container FrameLayout'umun kimliği
Pre_hacker

Şimdiye kadar Fragment Manager'ı kullanarak parça ekleme / değiştirme parçasına veri aktarmak için bulduğum en iyi açıklama. Gem gibi çalışır! Teşekkürler!
sam

R.id.container yerine R.id.nav_host_fragment kullanılmış
Bahaa Hany

10

Yeni başlayanlar için, burada en çok yükselen 2 cevap arasındaki farkın bir parçanın farklı kullanımı ile verildiğini eklemek istiyorum.

Bu parçayı, geçmek istediğiniz verilerin bulunduğu java sınıfı içinde kullanırsanız, veriyi iletmek için ilk yanıtı uygulayabilirsiniz:

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

Ancak, sekmeli parçalar için Android Studio tarafından verilen varsayılan kodu kullanırsanız, bu kod çalışmaz.

Bu sizin FragmentClasses varsayılan PlaceholderFragment değiştirirseniz bile işe ve siz) GetItem (bir anahtar ekleyerek yeni bir durum) ve getPageTitle (başka anahtara FragmentPagerAdapter düzeltmek bile (gösterildiği gibi olmaz burada )

Uyarı: yukarıda belirtilen klibin burada daha sonra açıklayacağım kod hataları var, ancak varsayılan koddan sekmeli parçalar için düzenlenebilir koda nasıl geçtiğinizi görmek için yararlıdır)! Bu klipteki java sınıflarını ve xml dosyalarını (yeni başlayan bir senaryo tarafından sekmeli parçaların ilk kullanımı için temsilci) düşünürseniz, cevabımın geri kalanı çok daha mantıklı.

Bu sayfadan en çok oylanan yanıtın işe yaramamasının ana nedeni, sekmeli parçalar için varsayılan kodda, parçaların başka bir java sınıfında kullanılmasıdır: FragmentPagerAdapter!

Bu nedenle, verileri göndermek için MotherActivity'de bir paket oluşturup 2 no'lu cevabı kullanarak FragmentPagerAdapter içine iletebilirsiniz.

Sadece bu yine yanlış. ( Muhtemelen böyle yapabilirsin, ama bu gerçekten gerekli olmayan bir komplikasyon ).

Bunu yapmanın doğru / kolay yolu, bence, 2 numaralı cevabı kullanarak verileri doğrudan söz konusu parçaya aktarmaktır. Evet, Etkinlik ve Fragman arasında sıkı bir bağlantı olacaktır, ancak sekmeli fragmanlar için bu beklenen bir durumdur. Hatta MotherActivity java sınıfının içinde sekmeli fragmanlar oluşturmanızı bile tavsiye ederim (asla MotherActivity dışında kullanılmayacakları için alt sınıflar olarak) - kolaydır, sadece MotherActivity java sınıfının içine ihtiyacınız olduğu kadar çok Parça ekleyin:

 public static class Tab1 extends Fragment {

    public Tab1() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
        return rootView;
    }
}.

Bu nedenle, MotherActivity'den böyle bir Fragmana veri aktarmak için, Ana faaliyetinizin onCreate'inin üstünde özel Dizeler / Paketler oluşturmanız gerekir; bunlar, parçalara aktarmak istediğiniz verileri doldurabilir ve bunları bir onCreate'den sonra oluşturulan yöntem (burada getMyData () olarak adlandırılır).

public class MotherActivity extends Activity {

    private String out;
    private Bundle results;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mother_activity);

       // for example get a value from the previous activity
        Intent intent = getIntent();
        out = intent.getExtras().getString("Key");

    }

    public Bundle getMyData() {
        Bundle hm = new Bundle();
        hm.putString("val1",out);
        return hm;
    }
}

Ve sonra fragman sınıfında getMyData kullanın:

public static class Tab1 extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public Tab1() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
            TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);

            MotherActivity activity = (MotherActivity)getActivity();

            Bundle results = activity.getMyData();
            String value1 = results.getString("val1");

            output.setText(value1);
            return rootView;
        }
    }

Veritabanı sorgularınız varsa bunları MotherActivity'de yapmanızı öneririm (ve sonuçlarını yukarıda gösterildiği gibi bir paket içindeki tuşlara bağlı Dizeler / Tam Sayılar olarak iletirim), sekmeli parçaların içinde olduğu gibi, sözdiziminiz daha karmaşık hale gelir (bu getActivity olur) (), ve getIntent getActivity (). getIntent) olur, ancak istediğiniz gibi yapma seçeneğiniz de vardır.

Yeni başlayanlar için tavsiyem küçük adımlara odaklanmak. İlk olarak, HERHANGİ bir veri iletmeden çok basit bir sekmeli etkinlik açma niyetinizi alın. Çalışıyor mu? Beklediğiniz sekmeleri açar mı? Değilse, neden?

Bundan başlayın ve bu klipte sunulanlar gibi çözümler uygulayarak neyin eksik olduğuna bakın. Bu klip için mainactivity.xml hiçbir zaman gösterilmez. Bu kesinlikle sizi şaşırtacak. Ancak dikkat ederseniz, xml parça dosyalarında örneğin bağlamın (tools: context) yanlış olduğunu göreceksiniz. Her parça XML'inin doğru parça sınıfını (veya ayırıcı $ kullanarak alt sınıfı) işaret etmesi gerekir.

Ayrıca ana etkinlik java sınıfında tabLayout.setupWithViewPager (mViewPager) - TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs) satırından hemen sonra eklemeniz gerektiğini göreceksiniz; bu satır olmadan, görünümünüz aslında parçaların XML dosyalarına bağlı değildir, ancak SADECE ana etkinliğin xml dosyasını gösterir.

Ana etkinlik java sınıfındaki satıra ek olarak, ana etkinlik XML dosyasında sekmeleri durumunuza uyacak şekilde değiştirmeniz gerekir (örn. TabItems ekleme veya kaldırma). Ana etkinlik XML'sinde sekmeleriniz yoksa, ilk etapta oluşturduğunuzda muhtemelen doğru etkinlik türünü seçmediniz (yeni etkinlik - sekmeli etkinlik).

Son 3 paragrafta video hakkında konuştuğumu lütfen unutmayın! Yani ana aktivite XML dediğimde, videoda ana durum XML, sizin durumunuzda MotherActivity XML dosyası.


8

Zaman uyumsuz görevin (somut alt sınıf) parçasına bir başvuru iletirseniz, doğrudan parçaya erişebilirsiniz.

Parça referansını zaman uyumsuz göreve geçirmenin bazı yolları:

  • Eşzamansız göreviniz tam teşekküllü bir sınıfsa ( class FooTask extends AsyncTask), parçanızı yapıcıya iletin .
  • Eşzamansız göreviniz bir iç sınıfsa, eşzamansız görevin tanımlandığı kapsamda veya dış sınıfın bir alanı olarak bir son Fragment değişkeni bildirmeniz yeterlidir. Buna iç sınıftan erişebileceksiniz.

Cevabınız benim için oldukça yasal görünüyor, Yapılacak bazı örnek kodlar sağlayarak biraz daha genişletebilir misiniz?
Leon Armstrong

6

Bazen faaliyetinizde Niyet alabilirsiniz ve bilgileri çalışma parçanıza iletmeniz gerekir.
Parçayı başlatmanız gerekiyorsa, ancak hala çalışıyorsa, verilen cevaplar tamamdır, setArguments()çok yararlı değildir.
Aktarılan bilgiler kullanıcı arayüzünüzle etkileşime girecekse başka bir sorun oluşur. Bu durumda, myfragment.passData()android hızlı bir şekilde yalnızca görünümü oluşturan iş parçacığının etkileşime girebileceğini söyleyeceği için böyle bir şey arayamazsınız.

Benim önerim bir alıcı kullanmak. Bu şekilde, etkinlik de dahil olmak üzere herhangi bir yerden veri gönderebilirsiniz, ancak iş parçanın bağlamında yapılacaktır.

Sizin parçanızda onCreate():

protected DataReceiver dataReceiver;
public static final String REC_DATA = "REC_DATA";

@Override
public void onCreate(Bundle savedInstanceState) {


    data Receiver = new DataReceiver();
    intentFilter = new IntentFilter(REC_DATA);

    getActivity().registerReceiver(dataReceiver, intentFilter);
}

private class DataReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        int data= intent.getIntExtra("data", -1);

        // Do anything including interact with your UI
    }
}

Faaliyetinizde:

// somewhere
Intent retIntent = new Intent(RE_DATA);
retIntent.putExtra("data", myData);
sendBroadcast(retIntent);

5

Çok eski yazı, hala benim için yararlı olurdu küçük bir açıklama eklemek cesaret.

Teknik olarak, bir parçadaki herhangi bir türden üyeyi doğrudan etkinlikten ayarlayabilirsiniz.
Peki neden Bundle?
Nedeni çok basit - Paket işlemek için tekdüze bir yol sağlar:
- parça oluşturma / açma
- yeniden yapılandırma (ekran döndürme) - outStateInstanceState () içindeki outState'a ilk / güncellenmiş paketi eklemeniz
- arka planda çöp toplandıktan sonra uygulama geri yüklemesi ( yeniden yapılandırmada olduğu gibi).

(Denemeleri seviyorsanız) basit durumlarda bir geçici çözüm oluşturabilirsiniz, ancak Bundle yaklaşımı bir backstack üzerinde bir parça ile bin arasındaki farkı görmez - basit ve anlaşılır kalır.
Bu yüzden @Elenasys'in cevabı en şık ve evrensel çözümdür.
Verdiği cevap Ve bu yüzden @Martin sahiptir tuzaklara


4

aktivite sınıfından parçaya veri göndermek için daha iyi yaklaşım, ayarlayıcı yöntemlerle geçmektedir. Sevmek

FragmentClass fragmentClass = new FragmentClass();
fragmentClass.setMyList(mylist);
fragmentClass.setMyString(myString);
fragmentClass.setMyMap(myMap);

ve bu verileri sınıftan kolayca alabilirsiniz.


Nasıl böyle parçasına parçasından veri aktarmak için stackoverflow.com/questions/32953477/pass-data-to-fragment
Hoo

Daha önce ayarlanmış olan Ekstralar
Gerard

Bu verilerin parçanızdaki bir alana ayarlanması gerekiyorsa ve henüz görünmüyorsa (başlatılmışsa) NPE alırsınız.
yozhik


Muhtemelen 3 yıl önce Android ile çalışmayı bıraktım, bu şeyler bugünlerde kullanımdan kaldırılabilir.
ssi-anik

4

Gönderen Activitysiz Bundle ile veri göndermek:

Bundle bundle = new Bundle();
bundle.putString("data", "Data you want to send");

// Your fragment
MyFragment obj = new MyFragment();
obj.setArguments(bundle);

Ve FragmentonCreateView yönteminde verileri alın:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    String data = getArguments().getString("data");// data which sent from activity  
    return inflater.inflate(R.layout.myfragment, container, false);
}

3

Bir Eğer activitybir hale getirmek için ihtiyaç fragmentbaşlatma bir işlem gerçekleştirmesini, en kolay yolu sahip olmasıyla activityilgili bir yöntem çağırmak fragmentörneği. Olarak fragment, bir yöntem ekleyin:

public class DemoFragment extends Fragment {
  public void doSomething(String param) {
      // do something in fragment
  }
}

ve ardından , yöneticiyi kullanarak activityerişin ve şunu arayın :fragmentfragmentmethod

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DemoFragment fragmentDemo = (DemoFragment) 
            getSupportFragmentManager().findFragmentById(R.id.fragmentDemo);
        fragmentDemo.doSomething("some param");
    }
}

ve sonra activitybunu fragmentçağırarak doğrudan ile iletişim kurabilir method.


1
bu gerçekten güzel, onCreateViewparçada yönteme girmek istemediğiniz için . gerçekten yardımcı oldu
Genç Emil

2

Etkinlik ve parça arasında iletişim kurmak için aşağıdaki arayüzü kullanın

public interface BundleListener {
    void update(Bundle bundle);
    Bundle getBundle();
}

Veya arayüzü kullanarak iki yönlü iletişim için bu genel dinleyiciyi takip etmeyi kullanın

 /**
 * Created by Qamar4P on 10/11/2017.
 */
public interface GenericConnector<T,E> {
    T getData();
    void updateData(E data);
    void connect(GenericConnector<T,E> connector);
}

fragman gösterisi yöntemi

public static void show(AppCompatActivity activity) {
        CustomValueDialogFragment dialog = new CustomValueDialogFragment();
        dialog.connector = (GenericConnector) activity;
        dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
    }

bağlamınızı GenericConnectorda onAttach(Context)yayınlayabilirsiniz

aktivitesinde

CustomValueDialogFragment.show(this);

parçanızda

...
@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        connector.connect(new GenericConnector() {
            @Override
            public Object getData() {
                return null;
            }

            @Override
            public void updateData(Object data) {

            }

            @Override
            public void connect(GenericConnector connector) {

            }
        });
    }
...
    public static void show(AppCompatActivity activity, GenericConnector connector) {
            CustomValueDialogFragment dialog = new CustomValueDialogFragment();
            dialog.connector = connector;
            dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
        }

Not: Asla böyle kullanmayın "".toString().toString().toString();.


2

yukarıdaki yöntemlerin çoğu işe yarayacaktır, ancak bu soru karşısında tökezledi. Sadece , özellikle bileşen (Etkinlik veya Fragman) oluşturulmamış senaryolarda Olay Otobüs Kütüphanesi'ni kullanabileceğinizi eklemek istiyorum , tüm android projeleri boyutları ve birçok kullanım durumu için iyi. Şahsen PlayStore'da yaptığım birkaç projede kullandım.


1

Bu parçanın statik referansını alacağınız parçada genel statik yöntem oluşturabilir ve daha sonra bu işleve veri aktarabilir ve bu verileri aynı yöntemde argüman olarak ayarlayabilir ve oncreate parça yöntemindeki getArgument aracılığıyla veri alabilir ve bu verileri yerel olarak ayarlayabilirsiniz. değişkenler.


1

Parçalar ve aktivite arasında veri aktarmanın denenmiş ve test edilmiş en akıllı yolu bir değişken oluşturmaktır, örnek:

class StorageUtil {
  public static ArrayList<Employee> employees;
}

Daha sonra verileri parçadan etkinliğe geçirmek için bunu onActivityCreated yönteminde yaparız:

//a field created in the sending fragment
ArrayList<Employee> employees;

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
         employees=new ArrayList();

       //java 7 and above syntax for arraylist else use employees=new ArrayList<Employee>() for java 6 and below

     //Adding first employee
        Employee employee=new Employee("1","Andrew","Sam","1984-04-10","Male","Ghanaian");
        employees.add(employee);

      //Adding second employee
       Employee employee=new Employee("1","Akuah","Morrison","1984-02-04","Female","Ghanaian");
         employees.add(employee);

        StorageUtil.employees=employees;
    }

Artık her yerden StorageUtil.employees değerini alabilirsiniz. İyi şanslar!


0

Benim çözüm parçası içinde statik bir yöntem yazmaktır:

public TheFragment setData(TheData data) {
    TheFragment tf = new TheFragment();
    tf.data = data;
    return tf;
}

Bu şekilde, ihtiyaç duyduğum tüm verilerin, onunla çalışması gereken herhangi bir olası işlemden önce Fragment içinde olduğundan eminim. Ayrıca bence daha temiz görünüyor.


1
TheData iş parçacığı güvenli değilse, statik hale getirmek mutlaka iş parçacığı sorunlarından korumak olmaz. Buna dikkat et. Statik, doğası gereği diş güvenli değildir.
Martin Marconcini

0

En son Navigasyon mimarisi bileşenini kullanırken benzer bir sorunla karşılaştım. Yukarıda belirtilen tüm kodu, çağrı etkinliğimden Fragment'a bir paket ileterek denedim.

Android'deki en son geliştirme trendlerini takip eden en iyi çözüm, View Model'i (Android Jetpack'in bir parçası) kullanmaktır.

Üst Etkinlikte bir ViewModel sınıfı oluşturma ve Başlatma, Lütfen bu ViewModel'in etkinlik ve parça arasında paylaşılması gerektiğini unutmayın.

Şimdi, parçanın onViewCreated () içinde, Aynı ViewModel'i başlatın ve ViewModel alanlarını dinlemek için Gözlemcileri ayarlayın.

İhtiyacınız olursa yardımcı olacak derinlemesine bir eğitici.

https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c


-4

Faaliyetinizde statik değişken bildiriniz

public static HashMap<String,ContactsModal> contactItems=new HashMap<String, ContactsModal>();

Sonra parçanızda takip etmeyi sev

ActivityName.contactItems.put(Number,contactsModal);

Çalışır, ancak ÖNERİLMEZ. Statik üyeler, uygulama son uygulamalardan zorla kapatılmadığı sürece bellekte kalacaktır. Yani böyle bir durumda statik üyeyi sadece uygulama boyunca birçok aktivitede ihtiyacınız olduğunda kullanmalısınız.
M Shaban Ali
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.