Fragment
S 와 함께 Kotlin Android Extensions를 사용하는 방법은 무엇입니까? inside을 사용 onCreateView()
하면이 NullPointerException
예외가 발생합니다.
원인 : java.lang.NullPointerException : null 객체 참조에서 가상 메소드 ‘android.view.View android.view.View.findViewById (int)’를 호출하려고했습니다.
조각 코드는 다음과 같습니다.
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
}
}
`
답변
Kotlin 합성 속성은 마술이 아니며 매우 간단한 방식으로 작동합니다. 에 액세스 btn_K
하면이 (가) 호출됩니다 getView().findViewById(R.id.btn_K)
.
문제는 너무 빨리 액세스한다는 것입니다. getView()
반환 null
에서 onCreateView
. 방법으로 시도하십시오 onViewCreated
.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
}
답변
btn_K
그 시점에서 null을 반환하고 널 포인터 예외를 발생시키는 즉시 호출합니다 .
Fragment 라이프 사이클 onActivityCreated()
직후 onCreateView()
에 호출 되는 메소드 에서이 합성 플러그인으로 이러한 뷰를 사용할 수 있습니다 .
onActivityCreated()
{
super.onActivityCreated(savedInstanceState)
btn_K.setOnClickListener{}
}
답변
에 의해 생성 된 합성 특성 코 틀린 안드로이드 확장 플러그인 필요 view
를 위해 Fragment/Activity
손 전에 설정해야합니다.
귀하의 경우에는, 위해 Fragment
, 당신은 사용할 필요가 view.btn_K
있는onViewCreated
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
val view = inflater.inflate(R.layout.fragment_card_selector, container, false)
view.btn_K.setOnClickListener{} // access with `view`
return view
}
또는 더 나은, 당신은 합성 속성에 액세스해야합니다 onViewCreated
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
return inflater.inflate(R.layout.fragment_card_selector, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btn_K.setOnClickListener{} // access without `view`
}
것을주십시오 통지 savedInstanceState
매개 변수가 널 (NULL)이어야한다 Bundle?
, 또한 확인 합성 속성을 가져 오기
특정 레이아웃에 대한 모든 위젯 속성을 한 번에 가져 오는 것이 편리합니다.
import kotlinx.android.synthetic.main.<layout>.*
따라서 레이아웃 파일 이름이 activity_main.xml이면 가져옵니다.
kotlinx.android.synthetic.main.activity_main.*.
View에서 합성 속성을 호출하려면 가져와야합니다.
kotlinx.android.synthetic.main.activity_main.view.*.
답변
당신이해야 할 유일한 것은 :
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var rootView = inflater?.inflate(R.layout.fragment_card_selector, container, false)
rootView.btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
return rootView
}
답변
컴패니언 객체를 정의 할 필요가 없습니다.
lateinit var mView: View
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
mView=inflater.inflate(R.layout.product_list,container,false)
mView.addProduct.setOnClickListener {
val intent=Intent(activity,ProductAddActivity::class.java)
startActivity(intent)
} return mView
}
답변
조각에서 onActivityCreated에 코드를 작성하십시오.
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
return inflater.inflate(R.layout.login_activity, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
callbackManager = CallbackManager.Factory.create()
initialization()
onClickLogin()
onClickForgot()
onClickSocailLogIn()
}