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
}
}