NullPointerException при использовании setOnActionExpandListener

Помогите разобраться, почему появляется NullPointerException при использовании setOnActionExpandListener?

Использован Binding и MenuInflater:

private lateinit var bindingClass: ActivityCoordinatorBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    bindingClass = ActivityCoordinatorBinding.inflate(layoutInflater)
    setContentView(bindingClass.root)
    setSupportActionBar(bindingClass.toolBar)
    initToolbar()
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.toolbar_menu, menu)
    return true
}

Ошибка выходит вот в этом месте:

val searchItem = bindingClass.toolBar.menu.findItem(R.id.action_search)
searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
    override fun onMenuItemActionExpand(item: MenuItem?): Boolean {
        bindingClass.searchExpand.text = "Search expanded"
        return true
    }
    override fun onMenuItemActionCollapse(item: MenuItem?): Boolean {
        bindingClass.searchExpand.text = "Search collapsed"
        return true
    }
})

Описание SearchView в меню:

<item
    android:id="@+id/action_search"
    android:title="@string/action_search"
    app:showAsAction="ifRoom|collapseActionView"
    app:actionViewClass="androidx.appcompat.widget.SearchView"
    android:icon="@drawable/ic_search"
    android:iconTint="@android:color/white"
    app:iconTint="@android:color/white" />

Стектрейс ошибки:

4128-4128/com.example.toolbar E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.toolbar, PID: 4128
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.toolbar/com.example.toolbar.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'android.view.MenuItem android.view.MenuItem.setOnActionExpandListener(android.view.MenuItem$OnActionExpandListener)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
 Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'android.view.MenuItem android.view.MenuItem.setOnActionExpandListener(android.view.MenuItem$OnActionExpandListener)' on a null object reference
    at com.example.toolbar.MainActivity.initToolbar(MainActivity.kt:75)
    at com.example.toolbar.MainActivity.onCreate(MainActivity.kt:38)

Ответы (1 шт):

Автор решения: Vadik

Вы обращаетесь к элементам меню до того, как они были созданы, из метода onCreate. Надувание меню происходит в методе onCreateOptionsMenu, который выполняется позже (посмотрите красивую картинку жизненного цикла активити).

Чтобы исправить проблему, делайте все манипуляции с элементами меню уже после того, как меню будет надута:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        val searchItem = toolbar.menu.findItem(R.id.action_search)
        // здесь searchItem это null, использовать нельзя
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.toolbar_menu, menu)
        val searchItem = menu.findItem(R.id.action_search)
        // здесь searchItem можно использовать
        return true
    }

}
→ Ссылка