3

Androidでkotlin言語を使用して学習し始め、ボタン変数の初期化中に問題が発生しました。これは、変数を定義するときに、null値で初期化し、oncreate関数で変数をバインドすると、初期値を与えるように求められるためです。

kotlin.KotlinNullPointerException

ここに私のコードがあります

class AddsFragment : Fragment() {

    var Add: Button = null!!

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val Rootview = inflater!!.inflate(R.layout.clubsfragment, null, false)
        Add = Rootview.findViewById(R.id.add) as Button
        return Rootview
    }
}
4

3 に答える 3

16

オペレーターは、レシーバーが throws であるかどうか、および throws である!!かどうかをチェックします。したがって、常に例外がスローされます。nullKotlinNullPointerExceptionnull!!

次の方法で目的を達成できます。

  1. プロパティのタイプを に設定しますButton?。この場合、ボタンのメソッドにアクセスするときは、 または のいずれかを使用する必要があり?ます!!

    var add: Button? = null
    // Initialize it somewhere.
    
    add?.setText("Text") // Calls setText if Add != null
    add!!.setText("Text") // Throws an exception if Add == null
    
  2. ボタンをlateinitプロパティにします。

    lateinit var add: Button
    
  3. ボタンをnotNullデリゲート プロパティにします。

    var add: Button by Delegates.notNull()
    

最後の 2 つのケースでは、ボタンが であるかどうかを確認できませんnullnull変数に対して機能するために比較が必要な場合は、最初のアプローチを使用します。


この回答では詳しく説明しない別のアプローチがあります。最初にKotlin Android Extensionsを使用します。これは、ビューの合成プロパティを生成するコンパイラ プラグインであるため、呼び出す必要がなく、findViewById()生成されたプロパティを使用してビューにアクセスできます。

2 番目の方法は、あなたを呼び出す独自のデリゲートを作成するfindViewById()ことです。次のようになります。

val add: Button by bindView(R.id.add)

このようなデリゲートの例は、KotterKnifeプロジェクトにあります。

于 2016-05-29T19:08:01.427 に答える