簡體   English   中英

Kotlin Android Extensions提供布局空指針

[英]Kotlin Android Extensions giving Layout Null Pointer

有一個相當簡單的場景給我帶來了很多麻煩。 我正在使用嵌入式片段制作一個非常簡單的Activity。 這個片段只是一個顯示一些圖像的Gridview。 當引用使用Kotlin擴展的Gridview直接引用XML id時會出現問題。 這是什么問題? kotlinx不能用於靜態片段嗎?

錯誤:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.android_me/com.example.android.android_me.ui.MainActivity}: java.lang.IllegalStateException: gridview_all_parts must not be null
 Caused by: java.lang.IllegalStateException: gridview_all_parts must not be null                                                                                  at com.example.android.android_me.ui.MasterListFragment.onActivityCreated(MasterListFragment.kt:22)

帶有令人反感的代碼行的片段

import kotlinx.android.synthetic.main.fragment_master_list.*

    class MasterListFragment: Fragment() {

        override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            val layoutView = inflater?.inflate(R.layout.fragment_master_list, container, false)
            return layoutView
        }

        override fun onActivityCreated(savedInstanceState: Bundle?) {
            //If this is removed, code runs
            gridview_all_parts.adapter = MasterListAdapter(activity, AndroidImageAssets.getAll())
            super.onActivityCreated(savedInstanceState)
        }
    }

片段布局:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridview_all_parts"
    android:layout_width="match_parent" android:layout_height="match_parent"/>

父活動布局

<?xml version="1.0" encoding="utf-8"?>
<!--have tried both class:= and android:name:=-->
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    class="com.example.android.android_me.ui.MasterListFragment"
    android:id="@+id/fragment_masterlist"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

家長活動

class MainActivity: AppCompatActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

要在Fragment中使用擴展,您需要使用layoutView 這應該工作: layoutView.gridview_all_parts.adapter = MasterListAdapter(activity, AndroidImageAssets.getAll())

在這種情況下,您可以使layoutView全局化。

更新的解釋它與視圖膨脹有關。 就像在butterknife中一樣,我們需要在fragment / recyclerView的情況下綁定膨脹的視圖,類似於kotlin,我們需要使用inflate視圖來訪問xml中的視圖。

引自官方文件

導入合成屬性可以一次導入特定布局的所有窗口小部件屬性:

import kotlinx.android.synthetic.main.<layout>.*

因此,如果布局文件名是activity_main.xml ,我們將導入

kotlinx.android.synthetic.main.activity_main。*。

如果我們想在View上調用合成屬性,我們也應該導入

kotlinx.android.synthetic.main.activity_main.view.*.

一旦我們這樣做,我們就可以調用相應的擴展,這些擴展是以XML文件中的視圖命名的屬性。

對於在其他情況下發現此問題的每個人。

當我們為RecyclerView編寫適配器時,Android Extensions中的NPE也會出現(特別是:編寫CustomViewHolder)。

有關詳細信息以及如何解決此問題,請參閱LayoutContainer

  1. 將其添加到模塊級gradle中
apply plugin: 'kotlin-android-extensions'

android {
    androidExtensions {
        experimental = true
    }
    // your config
    defaultConfig {}
}
  1. 你的適配器
class MainViewHolder(override val containerView: View) :
    RecyclerView.ViewHolder(containerView), 
    LayoutContainer { // Extends this
        fun bind(item: News) = containerView.apply {
            tv_item_title.text = item.title
        }
}

暫無
暫無

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

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