Saya sedang membuat aplikasi android, dan saya ingin meneruskan tanggal antara aktivitas dan fragmen. Aktivitas saya memiliki tombol, yang membuka fragmen: DatePickerFragment.
Dalam aktivitas saya, saya menunjukkan tanggal, yang ingin saya ubah dengan fragmen. Jadi saya ingin meneruskan tanggal ke datepicker, dan mengirimkannya kembali ke aktivitas.
Saya sudah mencoba banyak solusi, tetapi tidak ada yang berhasil. Cara yang mudah akan memberikan argumen, tetapi ini tidak dapat dilakukan dengan fragmen.
android
android-fragments
android-activity
Eugene Primako
sumber
sumber
Jawaban:
Untuk meneruskan info ke sebuah fragmen , Anda setArguments saat membuatnya, dan Anda bisa mengambil argumen ini nanti pada metode onCreate atau onCreateView dari fragmen Anda.
Pada fungsi newInstance dari fragmen Anda, Anda menambahkan argumen yang ingin Anda kirimkan:
/** * Create a new instance of DetailsFragment, initialized to * show the text at 'index'. */ public static DetailsFragment newInstance(int index) { DetailsFragment f = new DetailsFragment(); // Supply index input as an argument. Bundle args = new Bundle(); args.putInt("index", index); f.setArguments(args); return f; }
Kemudian di dalam fragmen pada metode
onCreate
atauonCreateView
Anda dapat mengambil argumen seperti ini:Bundle args = getArguments(); int index = args.getInt("index", 0);
Jika sekarang Anda ingin berkomunikasi dari fragmen dengan aktivitas Anda (mengirim atau tidak data) , Anda perlu menggunakan antarmuka. Cara Anda melakukan ini dijelaskan dengan sangat baik dalam tutorial dokumentasi komunikasi antar fragmen. Karena semua fragmen berkomunikasi satu sama lain melalui aktivitas, dalam tutorial ini Anda bisa melihat bagaimana Anda bisa mengirim data dari fragmen sebenarnya ke wadah aktivitasnya untuk menggunakan data ini pada aktivitas atau mengirimnya ke fragmen lain yang berisi aktivitas Anda.
Tutorial dokumentasi:
http://developer.android.com/training/basics/fragments/communicating.html
sumber
Mengirim data dari
Activity
ke aFragment
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) { String myValue = this.getArguments().getString("message"); ... ... ... }
Tetapi jika Anda ingin mengirim nilai dari Fragment ke Activity, membaca jawaban jpardogo, Anda harus membutuhkan antarmuka, info selengkapnya: Berkomunikasi dengan Fragmen lain
sumber
Parcelable
tapi itu memberi sayaclass cast exception
terima kasih kepada @ ρяσѕρєя K dan Terry ... ini banyak membantu saya dan bekerja dengan sempurna
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 Fragment onCreateView:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // get arguments String strtext = getArguments().getString("edttext"); return inflater.inflate(R.layout.fragment, container, false); }
referensi: Mengirim data dari aktivitas ke fragmen di android
sumber
Gunakan perpustakaan EventBus untuk meneruskan acara yang dapat berisi variabel Anda bolak-balik. Ini adalah solusi yang bagus karena membuat aktivitas dan fragmen Anda tetap terhubung secara longgar
https://github.com/greenrobot/EventBus
sumber
Mengirim data dari Aktivitas ke Fragmen yang ditautkan oleh XML
Jika Anda membuat fragmen di Android Studio menggunakan salah satu template, misalnya File> New> Fragment> Fragment (List), maka fragmen akan ditautkan melalui XML. Metode newInstance dibuat dalam fragmen tetapi tidak pernah dipanggil sehingga tidak dapat digunakan untuk meneruskan argumen.
Sebagai gantinya, dalam Activity, ganti metode onAttachFragment
@Override public void onAttachFragment(Fragment fragment) { if (fragment instanceof DetailsFragment) { Bundle args = new Bundle(); args.putInt("index", index); f.setArguments(args); } }
Kemudian baca argumen dalam metode fragmen onCreate sesuai jawaban lainnya
sumber
Untuk semua developer Kotlin di luar sana:
Berikut adalah solusi yang diusulkan Android Studio untuk mengirim data ke Fragmen Anda (= saat Anda membuat Fragmen Kosong dengan File -> Baru -> Fragmen -> Fragmen (Kosong) dan Anda mencentang "sertakan metode pabrik fragmen").
Taruh ini di Fragmen Anda:
class MyFragment: Fragment { ... companion object { @JvmStatic fun newInstance(isMyBoolean: Boolean) = MyFragment().apply { arguments = Bundle().apply { putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean) } } } }
.apply
adalah trik yang bagus untuk menyetel data saat sebuah objek dibuat, atau seperti yang dinyatakan di sini :Kemudian di Aktivitas atau Fragmen Anda lakukan:
val fragment = MyFragment.newInstance(false) ... // transaction stuff happening here
dan baca Argumen di Fragmen Anda seperti:
private var isMyBoolean = false override fun onAttach(context: Context?) { super.onAttach(context) arguments?.getBoolean("REPLACE WITH A STRING CONSTANT")?.let { isMyBoolean = it } }
Untuk "mengirim" data kembali ke Aktivitas Anda , cukup tentukan fungsi di Aktivitas Anda dan lakukan hal berikut di Fragmen Anda:
(activity as? YourActivityClass)?.callYourFunctionLikeThis(date) // your function will not be called if your Activity is null or is a different Class
Nikmati keajaiban Kotlin!
sumber
Anda cukup membuat instance fragmen Anda dengan sebuah bundel:
Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);
sumber
Deklarasi variabel publik di kelas adalah cara termudah:
Di kelas sasaran:
public class MyFragment extends Fragment { public MyCallerFragment caller; // Declare the caller var ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Do what you want with the vars caller.str = "I changed your value!"; caller.i = 9999; ... return inflater.inflate(R.layout.my_fragment, container, false); } ... }
Di kelas penelepon:
public class MyCallerFragment extends Fragment { public Integer i; // Declared public var public String str; // Declared public var ... FragmentManager fragmentManager = getParentFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); myFragment = new MyFragment(); myFragment.caller = this; transaction.replace(R.id.nav_host_fragment, myFragment) .addToBackStack(null).commit(); ... }
Jika Anda ingin menggunakan aktivitas utama juga mudah:
Di kelas kegiatan utama:
public class MainActivity extends AppCompatActivity { public String str; // Declare public var public EditText myEditText; // You can declare public elements too. // Taking care that you have it assigned // correctly. ... }
Di kelas yang dipanggil:
public class MyFragment extends Fragment { private MainActivity main; // Declare the activity var ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Assign the main activity var main = (MainActivity) getActivity(); // Do what you want with the vars main.str = "I changed your value!"; main.myEditText.setText("Wow I can modify the EditText too!"); ... return inflater.inflate(R.layout.my_fragment, container, false); } ... }
Untuk lebih banyak kombinasi gunakan kreativitas Anda. :)
sumber