태그 보관물: kotlin-android-extensions

kotlin-android-extensions

Kotlin 프래그먼트의 뷰에 액세스하려고 할 때 NullPointerException이 발생했습니다. FragmentS 와 함께 Kotlin Android Extensions를

FragmentS 와 함께 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()

  }

답변

내 경우에는 의견에서 Otziii 의 조언을 따를 때까지 아무런 효과가 없었 습니다. 정리, 다시 빌드 (다시 시작할 필요 없음), 앱을 다시 실행하십시오. 나는 또한 갈 필요가 없었고 onActivityCreated단지 onCreateView트릭을 수행했습니다.

한 번은 잘못된 레이아웃을 팽창시키는 오류를 일으켜 예상되는 컨트롤을 분명히 얻지 못했습니다.