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.