2017-05-30 73 views
3

我試圖使用科特林Android和試圖申報的LinearLayout這樣使用意見:Android的 - 聲明,並在科特林

internal var linlay_SuccessfulPayment : LinearLayout = null!! 
internal var linlay_failPayment : LinearLayout 

linlay_SuccessfulPayment = findViewById(R.id.linlay_SuccessfulPayment) as LinearLayout 
linlay_failPayment = findViewById(R.id.linlay_failPayment) as LinearLayout 

但在日誌中我得到這個:

Caused by: kotlin.KotlinNullPointerException 
                     at com.example.activities.PaymentResult.<init>(Result.kt:14) 
                     at java.lang.Class.newInstance(Native Method) 
                     at android.app.Instrumentation.newActivity(Instrumentation.java:1096) 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3122) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)  
                     at android.app.ActivityThread.access$1100(ActivityThread.java:229)  
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)  
                     at android.os.Handler.dispatchMessage(Handler.java:102)  
                     at android.os.Looper.loop(Looper.java:148)  
                     at android.app.ActivityThread.main(ActivityThread.java:7329)  
                     at java.lang.reflect.Method.invoke(Native Method)  
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)  

請幫幫我。

回答

0

初始化像下面

internal var linlay_SuccessfulPayment : LinearLayout ?= null 
internal var linlay_failPayment : LinearLayout ?= null 

,並使用它像下面

linlay_SuccessfulPayment = findViewById<LinearLayout>(R.id.linlay_SuccessfulPayment) 
linlay_failPayment = findViewById<LinearLayout>(R.id.linlay_failPayment) 
0

您可以使用如下: -

var linlay_SuccessfulPayment : LinearLayout? = null 
var linlay_failPayment : LinearLayout? = null 


linlay_SuccessfulPayment = findViewById(R.id.linlay_SuccessfulPayment) as LinearLayout 
linlay_failPayment = findViewById(R.id.linlay_failPayment) as LinearLayout 
3

你的問題是與空性,這將是一個好地方使用lateinit關鍵字(documentation)

private lateinit var linlay_SuccessfulPayment: LinearLayout 
private lateinit var linlay_failPayment: LinearLayout 

這樣你可以定義一個不可爲空的var,但可以延遲初始化,你可以在onCreate()中做這些。
訪問前必須初始化它,否則您將得到PropertyNotInitialisedException

第二個選擇是使用property delegation暫緩初始化:

private var linlay_SuccessfulPayment: LinearLayout by Delegates.lazy { findViewById(R.id.linlay_SuccessfulPayment) as LinearLayout } 

這樣的觀點被初始化只使用它,你必須在一個地方所有的第一次。

3

使用!!操作者檢查是否值要應用的是null,並且如果是,則它將引發KotlinNullPointerException;否則它返回一個非空類型的值。寫下null!!基本上是throw KotlinNullPointerException(...)的簡寫。

對於Android的意見(何物體在一個特殊的init方法,而不是構造函數初始化其他情況下),你應該使用lateinit關鍵字:

internal lateinit var linlay_SuccessfulPayment: LinearLayout 
internal lateinit var linlay_failPayment: LinearLayout 

這可讓您在非空的屬性您的Activity,您在調用構造函數時不會進行初始化,但僅在以後的onCreate方法中進行初始化。但是,在這種情況下,您首先需要負責初始化變量,否則在運行時會發生異常。

1

我剛從Kotlin開始嘗試學習它。 我綁定這樣的觀點:

var myBtn: Button = findViewById<Button>(R.id.btnMyButton) as Button 

var btnLogin: Button = findViewById<Button>(R.id.btnLogin)