Bagaimana cara menggunakan Kotlin Android Extensions with Fragment
s? Jika saya menggunakannya di dalam onCreateView()
, saya mendapatkan NullPointerException
pengecualian ini :
Disebabkan oleh: java.lang.NullPointerException: Mencoba untuk memanggil metode virtual 'android.view.View android.view.View.findViewById (int)' pada referensi objek nol
Ini adalah kode fragmen:
package com.obaied.testrun.Fragment
import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.obaied.acaan.R
import kotlinx.android.synthetic.main.fragment_card_selector.*
public class CardSelectorFragment : Fragment() {
val TAG = javaClass.canonicalName
companion object {
fun newInstance(): CardSelectorFragment {
return CardSelectorFragment()
}
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var rootView = inflater?.inflate(R.layout.fragment_card_selector, container, false)
btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
return rootView
}
}
`
android
kotlin
kotlin-android-extensions
solidak
sumber
sumber
rootView.btn_K.setOnClickListener
Jawaban:
Sifat sintetis Kotlin bukanlah sihir dan bekerja dengan cara yang sangat sederhana. Ketika Anda mengakses
btn_K
, itu panggilan untukgetView().findViewById(R.id.btn_K)
.Masalahnya adalah Anda terlalu cepat mengaksesnya.
getView()
kembalinull
dionCreateView
. Coba lakukan dalamonViewCreated
metode:sumber
onViewCreated()
getView()
atau tidak dapat dipanggilfindViewById()
, apakah ada cara untuk mengatasinya? Misalnya, ajarkan fungsi mana yang akan mengembalikan tata letak saya?rootView.btn_K
jika Anda memiliki tampilan (dan tidak hanya dalam fragmen, ini dapat dilakukan di mana-mana)Anda memanggil ini
btn_K
terlalu cepat karena pada saat itu mengembalikan nol dan memberi Anda Null Pointer Exception.Anda dapat menggunakan tampilan ini dengan plugin sintetis ini dalam
onActivityCreated()
metode yang disebut hanya setelahonCreateView()
siklus hidup Fragmen.sumber
onViewCreated
tetapi kemudian didefinisikan dalamonActivityCreated
. Tidak tahu kenapa.Sifat sintetik yang dihasilkan oleh Kotlin Android Ekstensi Plugin membutuhkan
view
untukFragment/Activity
harus ditetapkan sebelum tangan.Dalam kasus Anda, untuk
Fragment
, Anda perlu menggunakanview.btn_K
dionViewCreated
Atau lebih baik, Anda hanya boleh mengakses properti sintetis di
onViewCreated
Harap perhatikan bahwa
savedInstanceState
parameter harus nullableBundle?
, dan periksa juga Mengimpor properti sintetissumber
satu-satunya hal yang perlu Anda lakukan adalah:
sumber
val view = inflater.inflate() view.button.text = "caption"
.rootView.subView.doSomething
. Lebih baik menggunakan tampilan mulai darionViewCreated
tidak perlu mendefinisikan objek pendamping cukup panggil setiap id dengan tampilan seperti
sumber
Dalam Fragmen, harap tulis kode Anda di onActivityCreated: -
sumber
onViewCreated
?Dalam kasus saya, tidak ada yang berhasil sampai saya mengikuti saran dari Otziii dalam komentar. Bersihkan, bangun kembali (tidak perlu restart), jalankan kembali aplikasi. Saya juga tidak perlu ikut
onActivityCreated
dan hanyaonCreateView
melakukan trik.Suatu kali saya juga membuat kesalahan karena menggelembungkan tata letak yang salah, sehingga tidak mendapatkan kontrol yang diharapkan.
sumber
onActivityCreated
terlaluMenambahkannya ke jawaban @Egor Neliuba, Ya setiap kali Anda memanggil tampilan tanpa referensi, kotlinex mencari rootView, dan karena Anda berada di dalam sebuah fragmen dan fragmen tidak memiliki
getView()
metode. Karena itu mungkin melemparNullPointerException
Ada dua cara untuk mengatasi ini,
onViewCreated()
seperti yang disebutkanAtau Jika Anda ingin mengikat tampilan di beberapa kelas lain (katakanlah anonim), Anda cukup membuat fungsi ekstensi seperti ini,
fun View.bindViews(){...}
Pendekatan kedua sangat membantu, ketika Anda memiliki satu fragmen dengan beberapa perilaku.
sumber
}
** Di sini Anda menggunakan btn_K.setOnClickListener sebelum menemukan -Anda harus menemukan bentuk elemen xml ke kode java / kotlin Anda dengan menggunakan findViewById lalu dan kemudian hanya Anda yang dapat melakukan operasi pada tampilan atau elemen tersebut.
-Jadi itu sebabnya eksekusi null pointer Anda dapatkan
**
sumber