2015-12-31 13 views
74

Fragment秒でKotlin Androidの拡張機能を使用するには? 私はonCreateView()内でそれらを使用している場合、私はこのNullPointerException例外を取得:java.lang.NullPointerExceptionが:によって引き起こさKotlin Androidの拡張およびフラグメント

仮想 方法「android.view.View android.view.View.findViewById(int型を起動しようとします)」ここ nullオブジェクト参照に

は、断片コードである:

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 
    } 
} 
` 
+0

onCreateViewで実行したい場合は、btn_KもrootViewのプロパティになります。 あなたはそれが働いた 'rootView.btn_K.setOnClickListener' – Makotosan

答えて

166

Kotlin合成特性が魔法ないおよびWO非常に簡単な方法でrk。 btn_Kにアクセスすると、getView().findViewById(R.id.btn_K)が呼び出されます。

問題は、あまりにもすぐにそれにアクセスしているということです。 getView()nullonCreateViewに返します。 onViewCreated方法でそれをやって試してみてください:あなたはあまりにも早く、それはnullを返し、その時点で、このbtn_Kを呼び出しているし、あなたにNULLポインタ例外を与えている

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { 
    btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); } 
} 
+2

を行うことができます!ありがとう。 今後の参考のためだけで簡単にヘッドアップ。別の例外がありました。もう少し深く掘り下げました。Null参照例外は、合成プロパティにアクセスしようとするUIスレッドの非同期コールバックから発生していましたが、その時点ではすでにnullでした。 _Safe Call_演算子(?)またはその他のnull安全演算子を使用していることを確認してください。 また、ビューのクラス参照を維持し、 'onViewCreated() '以外の合成プロパティに依存しないようにするのに役立ちます – Solidak

+2

アクティビティとフラグメントに対して異なるコードを生成しますか? 'getView()'が含まれていない、あるいは 'findViewById()'を呼び出せない構造体を使用する場合、回避する方法はありますか?たとえば、どの関数がレイアウトを返すか教えてください。 – milosmns

+4

ビューがあれば 'rootView.btn_K'のようにアクセスすることもできます(フラグメントではなく、これはどこでも行うことができます) –

1

フラグメントライフサイクルのonCreateView()の直後に呼び出されるonActivityCreated()メソッドで、この合成プラグインによってこれらのビューを使用できます。

onActivityCreated() 
{ 
     super.onActivityCreated(savedInstanceState) 
     btn_K.setOnClickListener{} 
} 
+0

答えはすでに受け入れられました。 – Solidak

関連する問題