簡體   English   中英

Android Kotlin:在顯示 Snackbar 之前檢查視圖是否不是 null

[英]Android Kotlin: check if view is not null before displaying Snackbar

當使用retrofit加載數據時,我使用以下代碼顯示小吃欄。

有時,當用戶嘗試從該片段導航到另一個片段而獲取數據的請求尚未終止時,我會收到NullPointerException

kotlin.KotlinNullPointerException at com.test.data.ui.cars.SiteCarsFragment$getCars$1.onFailure(SiteCarsFragment.kt:279) at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$2.run(DefaultCallAdapterFactory.java:92) at android.os.Handler .handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:224) at android.app.ActivityThread.main(ActivityThread. java:7520) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Z93F725A07423FE1C889F448B33D21F 46Z:539) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.Z93F725A07423FE1C889F448B03D21F46Z9)5:

這是因為在這種情況下view是 null 。

如何修改代碼以確保在顯示快餐欄之前定義視圖?

// Call getCars() API
val call = App.myService.getCars(site.id!!)
call.enqueue(object : Callback<CarsResponse> {

    override fun onResponse(call: Call<CarsResponse>, response: Response<CarsResponse>) {

        Log.i(tagLabel, "getCars() - onResponse() Result = ${response.body()}")

        if (response.code() == 200) {

            if (response.body()?.data?.size == 0){
                // do stuff
            } else {
                val sb = Snackbar.make(view!!, getString(R.string.mytitle), Snackbar.LENGTH_SHORT)
                sb.view.setBackgroundColor(ContextCompat.getColor(context!!, R.color.snackbarGreen))
                sb.show()
            }

        }
    }

    override fun onFailure(call: Call<CarsResponse>, t: Throwable) {
        // do stuff
    }

})

我會試試這個。 我剛剛添加了一個 null 檢查

if(view != null){

  // Your code
  val sb = Snackbar.make(view!!, getString(R.string.mytitle), Snackbar.LENGTH_SHORT)
  sb.view.setBackgroundColor(ContextCompat.getColor(context!!, R.color.snackbarGreen))
  sb.show()
}

您應該使用引用您的活動的視圖(因為如果您的片段之一是活動視圖,則不會被破壞)。 如果您有任何活動視圖的實例,請將其傳遞到那里。

或者你可以試試這個:

val sb = Snackbar.make(activity!!.findViewById(android.R.id.content), getString(R.string.mytitle), Snackbar.LENGTH_SHORT)

這里我用過!! 但活動不會是 null 除非它被破壞。

編輯:在這里,如果您使用帶有 null 檢查的片段視圖,如果您的片段視圖因在片段之間切換而被破壞,您的小吃欄將不會顯示。 因此,如果您希望在片段的視圖被破壞后仍顯示它,則應該使用活動的視圖或上面的代碼。

我建議您在使用視圖的地方擺脫雙鍵(!!)運算符並使用空安全(?)運算符! 上下文。!

你應該這樣做:

if(view !=null){
//TODO Snakbar code here.
}

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM