264

sで Kotlin Android 拡張機能を使用するにはFragment? 内部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
    }
}
`
4

9 に答える 9

486

Kotlin 合成プロパティは魔法ではなく、非常に単純な方法で機能します。にアクセスするbtn_Kと、 が呼び出されgetView().findViewById(R.id.btn_K)ます。

問題は、アクセスするのが早すぎることです。にgetView()戻ります。メソッドで試してみてください:nullonCreateViewonViewCreated

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    btn_K.setOnClickListener { Log.d(TAG, "onViewCreated(): hello world"); }
}
于 2015-12-31T08:01:55.567 に答える
0

@Egor Neliubaの答えに追加します。はい、参照なしでビューを呼び出すたびに、kotlinexはrootViewを探します。フラグメント内にあり、フラグメントにはgetView()メソッドがないためです。したがって、それはスローされる可能性がありますNullPointerException

これを克服するには2つの方法があります。

  • onViewCreated()前述のようにオーバーライドするか
  • または、他のクラス (匿名など) でビューをバインドする場合は、次のような拡張関数を簡単に作成できます。

    fun View.bindViews(){...}

2 番目のアプローチは、複数の動作を持つ単一のフラグメントがある場合に役立ちます。

于 2019-08-16T07:24:06.167 に答える