Saya membuat aktivitas navigasi bawah di proyek saya, yang berisi satu aktivitas dan dua fragmen. Dalam Aktivitas Utama saya memiliki nilai yang disimpan dalam variabel tetapi jika saya meneruskan nilai ke fragmen maka saya mendapatkan kesalahan Pengecualian NullPointer. Saya menggunakan kotlin dalam proyek saya dan bantuan apa pun dihargai. Ekspektasi:
Get Value into Fragment from MainActivity. MainActivity--->TestOneFragment
Error:
kotlin.KotlinNullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
Solutip
Berikut adalah contoh newInstancepola pembuatannya Fragments.
Ini ada di dalam a companion object, yang merupakan cara untuk mengatakan "hal-hal ini Statis."
Pertama, Anda harus menentukan konstanta untuk Bundlenama Anda, ini akan membantu menjaga semuanya tetap selaras. Selanjutnya, tentukan newInstancemetode yang menggunakan parameter Anda, seperti name.
Dan di dalam sana, Anda akan membuat Fragmentdan mengembalikannya. Dengan cara ini, Anda Activitytidak perlu khawatir tentang Bundleatau apa pun. Semua logika Anda ada di satu tempat, untuk menyimpan/mengambil, semua dalam file Fragment.
class TestOneFragment {
companion object {
const val ARG_NAME = "name"
fun newInstance(name: String): TestOneFragment {
val fragment = TestOneFragment()
val bundle = Bundle().apply {
putString(ARG_NAME, name)
}
fragment.arguments = bundle
return fragment
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val name = arguments?.getString(ARG_NAME)
// ...
}
}
Dan sekarang, Anda dapat dengan mudah mendapatkannya Fragmentdengan melakukan hal berikut.
class Test : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
// ...
val name = intent.getStringExtra("name")
// Creating the new Fragment with the name passed in.
val fragment = TestFragment.newInstance(name)
}
}