Kirim data dari aktivitas ke fragmen di Android

317

Saya punya dua kelas. Pertama adalah aktivitas, kedua adalah fragmen di mana saya memiliki beberapa EditText. Dalam aktivitas saya memiliki subclass dengan async-task dan dalam metode doInBackgroundsaya mendapatkan beberapa hasil, yang saya simpan ke variabel. Bagaimana saya bisa mengirim variabel ini dari subkelas "aktivitas saya" ke fragmen ini?

pengguna1302569
sumber

Jawaban:

663

Dari Aktivitas Anda mengirim data dengan maksud sebagai:

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

dan dalam metode Fragmen onCreateView:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}
ρяσѕρєя K
sumber
15
dapatkah Anda meneruskan objek ke fragmen?
yeahman
63
Hmm saya mendapatkan NullPointerException saat menelepongetArguments().getString(key)
Nima G
9
NullPointerException "String strtext setArguments (). GetString (" edttext ");"
Jorgesys
4
Saat membaca konten bundel dalam fragmen, pertama-tama selalu terima bundel ke objek Bundle menggunakan metode getArguments dan periksa nol. Jika tidak, metode getString akan diterapkan pada null dan NPE ketika tidak ada bundel yang dilewati. Ini akan menghindari pengecualian penunjuk nol ketika bundel tidak disahkan.
balachandarkm
3
@Aznix. Tidak disarankan untuk membuat konstruktor untuk fragmen.
Azam
108

Anda juga dapat mengakses data aktivitas dari fragmen:

Aktivitas:

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

Pecahan:

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;
    }
}
Ricardas
sumber
78
Solusi ini mengintegrasikan penggabungan ketat antara aktivitas Anda dan Fragmen, lebih baik menggunakan Bundlekelas untuk menyampaikan informasi. Atau Anda bisa membuat getMyData()metode itu diwarisi dan diimplementasikan dari antarmuka dan Fragmentperiksa apakah getActivity mengembalikan instanceofAntarmuka di onAttach().
Rudi Kershaw
1
Solusi ini terbaik untuk saya. Juga jika myString bersifat publik, Anda belum mendeklarasikan metode getMyData ()
Burak Öztürk
1
Jawaban yang diterima saat ini menghasilkan pengecualian pointer nol. Ini harus menjadi jawaban yang diterima
Richmond
9
Ini seharusnya bukan jawaban yang diterima. Kopling ketat mudah dihindari. Ini umumnya ide yang buruk, dan membuat fragmen itu tidak berguna, mungkin juga tidak memiliki fragmen jika Anda hanya akan menggunakannya terikat pada suatu aktivitas. Fragmen tidak dapat digunakan kembali dalam aktivitas lain.
Martin Marconcini
51

Saya telah menemukan banyak jawaban di sini @ stackoverflow.com tapi jelas ini adalah jawaban yang benar:

"Mengirim data dari aktivitas ke fragmen di android".

Aktivitas:

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

Pecahan:

Membaca nilai dalam fragmen

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

atau hanya

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
        }
Jorgesys
sumber
Saya kira itu bukan pendekatan terbaik untuk memperbarui onQueryTextSubmit-hasil pencarian di ListView, yang bersarang di dalam Fragmen (jika seseorang mengetik cepat, ia akan mengirim argumen dua kali per detik)?
Martin Pfeffer
1
Bagaimana dengan Object insted string atau int?
Dario
2
@ Jorgesys Bagaimana dengan solusi ini? developer.android.com/training/basics/fragments/…
yozhik
23

Jawaban ini mungkin sudah terlambat. tetapi ini akan bermanfaat bagi pembaca masa depan.

Saya punya beberapa kriteria. Saya telah memberi kode untuk memilih file dari maksud. dan file yang dipilih untuk diteruskan ke fragmen tertentu untuk proses lebih lanjut. Saya punya banyak fragmen yang memiliki fungsi memilih file. pada saat itu, setiap kali mengecek kondisi dan mendapatkan fragmen serta melewati nilainya cukup menjijikkan. jadi, saya telah memutuskan untuk melewatkan nilai menggunakan antarmuka.

Langkah 1: Buat antarmuka di Aktivitas Utama.

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

Langkah 2: Buat referensi SelectedBundle pada Aktivitas yang Sama

   SelectedBundle selectedBundle;

Langkah 3: buat Metode di Aktivitas yang Sama

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

Langkah 4: Perlu menginisialisasi referensi SelectedBundle yang semuanya membutuhkan fungsionalitas filepicker. Anda menempatkan kode ini pada onCreateView(..)metode fragmen Anda

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

Langkah 5: Kasus saya, saya harus meneruskan gambar Uri dari HomeActivity ke fragmen. Jadi, saya menggunakan fungsionalitas ini pada metode onActivityResult.

onActivityResult dari MainActivity, meneruskan nilai ke fragmen menggunakan antarmuka.

Catatan: Kasing Anda mungkin berbeda. Anda dapat memanggilnya dari mana saja dari HomeActivity Anda.

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

Itu saja. Terapkan setiap fragmen yang Anda butuhkan di FragmentClass. Kamu hebat. sudah selesai. WOW...

Noorul
sumber
15

Ide dasar menggunakan Fragmen (F) adalah untuk membuat komponen UI mandiri yang dapat digunakan kembali dalam aplikasi android. Fragmen-fragmen ini terkandung dalam aktivitas dan ada cara umum (terbaik) untuk menciptakan jalur jalur komunikasi dari A -> F dan FA, Ini adalah suatu keharusan untuk Berkomunikasi di antara FF melalui suatu Kegiatan karena dengan demikian hanya Fragmen-fragmen yang akan dipisahkan dan mandiri.

Jadi meneruskan data dari A -> F akan sama dengan yang dijelaskan oleh ρяσѕρєя K. Selain jawaban itu, Setelah membuat Fragmen di dalam Aktivitas, kita juga bisa meneruskan data ke metode pemanggilan fragmen dalam Fragmen.

Sebagai contoh:

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

Pendekatan terbaik dan nyaman adalah memanggil contoh fragmen dan mengirim data pada saat itu. setiap fragmen secara default memiliki metode instance

Misalnya: jika nama fragmen Anda adalah MyFragment

jadi Anda akan memanggil fragmen Anda dari aktivitas seperti ini:

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

* R.id.container adalah id dari FrameLayout saya

jadi di MyFragment.newInstance ("data1", "data2") Anda dapat mengirim data ke fragmen dan di fragmen Anda, Anda mendapatkan data ini di MyFragment newInstance (String param1, String param2)

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

dan kemudian dalam metode fragmen onCreate Anda akan mendapatkan data:

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

jadi sekarang mParam1 memiliki data1 dan mParam2 memiliki data2

sekarang Anda dapat menggunakan mParam1 dan mParam2 ini dalam fragmen Anda.

Pre_hacker
sumber
Apa itu R.id.container di sini? maksud Anda R.id.container_current ini adalah nilai int.
shaurya uppal
@s * R.id.container adalah id dari FrameLayout saya
Pre_hacker
Sejauh ini penjelasan terbaik yang pernah saya temukan untuk meneruskan data pada penambahan / penggantian fragmen menggunakan Fragment Manager. Bekerja seperti permata! Terima kasih!
sam
menggunakan R.id.nav_host_fragment alih-alih R.id.container
Bahaa Hany
10

Saya ingin menambahkan untuk pemula bahwa perbedaan antara 2 jawaban yang paling banyak dipilih di sini diberikan oleh penggunaan fragmen yang berbeda.

Jika Anda menggunakan fragmen dalam kelas java di mana Anda memiliki data yang ingin Anda sampaikan, Anda bisa menerapkan jawaban pertama untuk meneruskan data:

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

Namun, jika Anda menggunakan misalnya kode default yang diberikan oleh Android Studio untuk fragmen tab, kode ini tidak akan berfungsi.

Ini tidak akan berfungsi bahkan jika Anda mengganti PlaceholderFragment default dengan FragmentClasses Anda, dan bahkan jika Anda memperbaiki FragmentPagerAdapter ke situasi baru menambahkan sebuah saklar untuk getItem () dan switch lain untuk getPageTitle () (seperti yang ditunjukkan di sini )

Peringatan: klip yang disebutkan di atas memiliki kesalahan kode, yang saya jelaskan nanti di sini, tetapi berguna untuk melihat bagaimana Anda beralih dari kode default ke kode yang dapat diedit untuk fragmen tab)! Sisa jawaban saya jauh lebih masuk akal jika Anda mempertimbangkan kelas java dan file xml dari klip itu (mewakili untuk penggunaan pertama fragmen tab dengan skenario pemula).

Alasan utama jawaban yang paling banyak dipilih dari halaman ini tidak akan berfungsi adalah bahwa dalam kode default untuk fragmen tab, fragmen tersebut digunakan di kelas java lain: FragmentPagerAdapter!

Jadi, untuk mengirim data, Anda tergoda untuk membuat bundel di MotherActivity dan meneruskannya di FragmentPagerAdapter, menggunakan jawaban no.2.

Hanya itu yang salah lagi. ( Mungkin Anda bisa melakukannya seperti itu, tetapi itu hanya komplikasi yang tidak benar-benar diperlukan ).

Cara yang benar / lebih mudah untuk melakukannya, saya pikir, adalah meneruskan data secara langsung ke fragmen yang dimaksud, menggunakan jawaban no.2. Ya, akan ada ikatan ketat antara Activity dan Fragment, TAPI, untuk fragmen tab, itu semacam yang diharapkan. Saya bahkan akan menyarankan Anda untuk membuat fragmen tab di dalam kelas java MotherActivity (sebagai subclass, karena mereka tidak akan pernah digunakan di luar MotherActivity) - mudah, cukup tambahkan di dalam kelas java MotherActivity sebanyak Fragmen yang Anda butuhkan seperti ini:

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

Jadi, untuk meneruskan data dari MotherActivity ke Fragmen seperti itu, Anda perlu membuat String / Bundel pribadi di atas onCreate dari aktivitas Ibu Anda - yang dapat Anda isi dengan data yang ingin Anda sampaikan ke fragmen, dan meneruskannya melalui metode yang dibuat setelah onCreate (di sini disebut getMyData ()).

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

Dan kemudian di kelas fragmen, Anda menggunakan getMyData:

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

Jika Anda memiliki kueri basis data, saya sarankan Anda melakukannya di MotherActivity (dan berikan hasilnya sebagai String / Integer yang dilampirkan pada kunci di dalam bundel seperti yang ditunjukkan di atas), seperti di dalam fragmen tab, sintaks Anda akan menjadi lebih kompleks (ini menjadi getActivity () misalnya, dan getIntent menjadi getActivity (). getIntent), tetapi Anda juga memiliki opsi untuk melakukan seperti yang Anda inginkan.

Saran saya untuk pemula adalah fokus pada langkah-langkah kecil. Pertama, dapatkan niat Anda untuk membuka aktivitas tab yang sangat sederhana, tanpa meneruskan data APA PUN. Apakah itu bekerja? Apakah itu membuka tab yang Anda harapkan? Jika tidak, mengapa?

Mulai dari itu, dan dengan menerapkan solusi seperti yang disajikan dalam klip ini , lihat apa yang hilang. Untuk klip tertentu itu, mainactivity.xml tidak pernah ditampilkan. Itu pasti akan membingungkan Anda. Tetapi jika Anda memperhatikan, Anda akan melihat bahwa misalnya konteks (alat: konteks) salah dalam file fragmen xml. Setiap fragmen XML harus mengarah ke kelas fragmen yang benar (atau subkelas menggunakan pemisah $).

Anda juga akan melihat bahwa di kelas utama aktivitas java Anda perlu menambahkan tabLayout.setupWithViewPager (mViewPager) - tepat setelah baris TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); tanpa baris ini, tampilan Anda sebenarnya tidak tertaut ke file XML dari fragmen, tetapi hanya menampilkan file xml dari aktivitas utama.

Selain baris di kelas java aktivitas utama, dalam file XML aktivitas utama Anda perlu mengubah tab agar sesuai dengan situasi Anda (mis. Menambah atau menghapus TabItems). Jika Anda tidak memiliki tab dalam XML aktivitas utama, maka mungkin Anda tidak memilih jenis aktivitas yang benar ketika Anda membuatnya di tempat pertama (aktivitas baru - aktivitas tab).

Harap perhatikan bahwa dalam 3 paragraf terakhir saya berbicara tentang video! Jadi ketika saya mengatakan XML aktivitas utama, itu adalah XML aktivitas utama dalam video, yang dalam situasi Anda adalah file XML MotherActivity.

Adrian Stoica
sumber
8

Jika Anda meneruskan referensi ke fragmen (subkelas beton) ke dalam tugas async, Anda kemudian dapat mengakses fragmen secara langsung.

Beberapa cara meneruskan referensi fragmen ke dalam tugas async:

  • Jika tugas async Anda adalah kelas yang lengkap ( class FooTask extends AsyncTask), lalu serahkan fragmen Anda ke konstruktor.
  • Jika tugas async Anda adalah kelas dalam, cukup mendeklarasikan variabel Fragmen akhir dalam lingkup tugas async didefinisikan, atau sebagai bidang kelas luar. Anda akan dapat mengaksesnya dari kelas dalam.
Martin
sumber
Jawaban Anda tampaknya cukup sah bagi saya, dapatkah Anda memperluas sedikit lagi dengan memberikan beberapa contoh kode untuk dilakukan?
Leon Armstrong
6

Terkadang Anda dapat menerima Intent dalam aktivitas Anda dan Anda harus meneruskan info tersebut ke fragmen kerja Anda.
Jawaban yang diberikan OK jika Anda perlu memulai fragmen tetapi jika masih berfungsi, setArguments()tidak terlalu berguna.
Masalah lain terjadi jika informasi yang dikirimkan akan menyebabkan berinteraksi dengan UI Anda. Dalam hal ini Anda tidak dapat memanggil sesuatu seperti myfragment.passData()karena Android akan dengan cepat memberi tahu bahwa hanya utas yang membuat tampilan dapat berinteraksi dengannya.

Jadi proposal saya adalah menggunakan penerima. Dengan begitu, Anda dapat mengirim data dari mana saja, termasuk aktivitas, tetapi pekerjaan akan dilakukan dalam konteks fragmen.

Dalam fragmen Anda 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
    }
}

Dalam aktivitas Anda:

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

Posting yang sangat lama, masih saya berani menambahkan sedikit penjelasan yang akan membantu saya.

Secara teknis Anda dapat secara langsung mengatur anggota jenis apa pun dalam fragmen dari aktivitas.
Jadi mengapa Bundle?
Alasannya sangat sederhana - Bundel menyediakan cara seragam untuk menangani:
- membuat / membuka fragmen
- konfigurasi ulang (rotasi layar) - cukup tambahkan bundel awal / yang diperbarui ke outState di onSaveInstanceState ()
- restorasi aplikasi setelah sampah dikumpulkan di latar belakang ( seperti dengan konfigurasi ulang).

Anda dapat (jika Anda suka eksperimen) membuat solusi dalam situasi sederhana tetapi pendekatan Bundle tidak melihat perbedaan antara satu fragmen dan seribu pada backstack - itu tetap sederhana dan mudah.
Itu sebabnya jawaban oleh @Elenasys adalah solusi paling elegan dan universal.
Dan itu sebabnya jawaban yang diberikan oleh @Martin memiliki jebakan

sberezin
sumber
4

pendekatan yang lebih baik untuk mengirim data dari kelas aktivitas ke fragmen adalah melalui metode setter. Suka

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

dan dapatkan data ini dari kelas dengan mudah.

ssi-anik
sumber
Cara meneruskan data dari fragmen ke fragmen seperti stackoverflow.com/questions/32953477/pass-data-to-fragment
Hoo
Ini sangat tidak nyaman ketika Anda juga melewati yang lain, yang sebelumnya ditetapkan Extra's
Gerard
Jika Anda membutuhkan data yang akan disetel ke beberapa bidang dalam fragmen Anda, dan itu belum terlihat (diinisialisasi) Anda akan mendapatkan NPE.
yozhik
Saya berhenti bekerja dengan Android kemungkinan 3 tahun yang lalu, hal-hal ini mungkin sudah usang hari ini.
ssi-anik
4

Dari ActivityAnda mengirim data dengan Bundle sebagai:

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

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

Dan dalam Fragmentmetode onCreateView dapatkan data:

@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);
}
Vijay
sumber
3

Jika suatu activitykebutuhan untuk fragmentmelakukan tindakan setelah inisialisasi, cara termudah adalah dengan activitymeminta metode pada fragmentinstance. Dalam fragment, tambahkan metode:

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

dan kemudian di activity, dapatkan akses ke fragmentmenggunakan fragmentpengelola dan panggil method:

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

dan kemudian activitydapat berkomunikasi langsung dengan fragmentdengan memohon ini method.


sumber
1
ini sangat bagus, dalam arti bahwa Anda tidak ingin masuk ke dalam onCreateViewmetode dalam fragmen. benar-benar membantu
Emil Muda
2

Gunakan antarmuka berikut untuk berkomunikasi antara aktivitas dan fragmen

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

Atau gunakan mengikuti pendengar generik ini untuk komunikasi dua arah menggunakan antarmuka

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

metode pertunjukan fragmen

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

Anda dapat melemparkan konteks Anda ke GenericConnectordalam onAttach(Context)terlalu

dalam aktivitas Anda

CustomValueDialogFragment.show(this);

dalam fragmen Anda

...
@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");
        }

Catatan: Jangan pernah gunakan seperti itu "".toString().toString().toString();.

Qamar
sumber
2

baru saja menemukan pertanyaan ini, sementara sebagian besar metode di atas akan berhasil. Saya hanya ingin menambahkan bahwa Anda dapat menggunakan Perpustakaan Event Bus , terutama dalam skenario di mana komponen (Aktivitas atau Fragmen) belum dibuat, bagus untuk semua ukuran proyek android dan banyak kasus penggunaan. Saya pribadi menggunakannya di beberapa proyek yang saya miliki di playstore.

Joshua Majebi
sumber
1

Anda dapat membuat metode statis publik dalam fragmen di mana Anda akan mendapatkan referensi statis fragmen itu dan kemudian meneruskan data ke fungsi itu dan mengatur data itu ke argumen dalam metode yang sama dan mendapatkan data melalui getArgument pada metode fragmen oncreate, dan mengatur data tersebut ke lokal variabel.

M.Noman
sumber
1

Cara yang paling dicoba dan teruji untuk mengirimkan data antara fragmen dan aktivitas adalah dengan membuat variabel, misalnya:

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

Kemudian untuk meneruskan data dari fragmen ke aktivitas, kami melakukannya dalam metode onActivityCreated:

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

Sekarang Anda bisa mendapatkan nilai dari StorageUtil.employees dari mana saja. Semoga berhasil!

Andrew Sam
sumber
0

Solusi saya adalah menulis metode statis di dalam fragmen:

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

Dengan cara ini saya yakin bahwa semua data yang saya butuhkan ada di dalam Fragmen sebelum operasi lain yang mungkin perlu dilakukan. Juga terlihat lebih bersih menurut saya.

Matteo
sumber
1
Nah, jika TheData tidak aman untuk thread, menjadikannya statis tidak akan selalu melindungi Anda dari masalah utas. Hati-hati dengan itu. Statis bukanlah benang yang aman secara alami.
Martin Marconcini
0

Saya mengalami masalah serupa saat menggunakan komponen arsitektur Navigasi terbaru. Mencoba semua kode yang disebutkan di atas dengan meneruskan bundel dari aktivitas pemanggilan saya ke Fragment.

Solusi terbaik, mengikuti tren perkembangan terbaru di Android, adalah dengan menggunakan View Model (bagian dari Android Jetpack).

Membuat dan Menginisialisasi kelas ViewModel dalam Aktivitas induk, Harap perhatikan bahwa ViewModel ini harus dibagi antara aktivitas dan fragmen.

Sekarang, Di dalam onViewCreated () dari fragmen, Inisialisasi ViewModel yang Sama dan setup Pengamat untuk mendengarkan bidang ViewModel.

Berikut ini adalah tutorial yang bermanfaat dan mendalam jika Anda membutuhkannya.

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

devDeejay
sumber
-4

Dalam aktivitas Anda deklarasikan variabel statis

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

Maka dalam fragmen Anda lakukan suka ikuti

ActivityName.contactItems.put(Number,contactsModal);
Dv Keerthi
sumber
Ini akan berhasil tetapi TIDAK DIANJURKAN. Karena anggota statis akan tetap berada dalam memori kecuali aplikasi dipaksa ditutup dari aplikasi terbaru. Jadi dalam kasus seperti ini Anda hanya boleh menggunakan anggota statis ketika Anda membutuhkannya dalam banyak aktivitas di seluruh aplikasi.
M Shaban Ali