kotlin.Исключение TypeCastException: значение null не может быть приведено к ненулевому типу

#android #exception #kotlin #casting #oncreateoptionsmenu

#Android #исключение #kotlin #Кастинг #oncreateoptionsmenu

Вопрос:

Я пытаюсь инициализировать пользовательский инструмент поиска (3d library) в меню, но я получил ошибку.

Вот мой код

  override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.base_nav_drawer,menu)
      searchItem= menu?.findItem(R.id.srchbar_menu)!!
            global_search= searchItem.actionView as MaterialSearchBar
       lastsuggestions=ArrayList<String>()
        loadSuggest()
global_search.lastSuggestions=lastsuggestions
        return true
    }
  

Сообщение Logcat

 kotlin.TypeCastException: null cannot be cast to non-null type com.mancj.materialsearchbar.MaterialSearchBar
        at com.example.sg772.foodorder.BaseNavDrawerActivity.onCreateOptionsMenu(BaseNavDrawerActivity.kt:136)
  

Я пробовал это

  global_search= searchItem.actionView as? MaterialSearchBar
  

Но это не помогает
строка 136 соответствует global_search= searchItem.actionView as MaterialSearchBar

xml меню

 <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@ id/srchbar_menu"
          android:title="search"
          android:icon="@drawable/ic_search_black_24dp"
          app:showAsAction="ifRoom|collapseActionView"
          app:actionViewClass="com.mancj.materialsearchbar.MaterialSearchBar"/>
</menu>
  

Комментарии:

1. Опубликуйте xml меню.

2. @forpas я добавил xml меню

Ответ №1:

Эта строка приводит к сбою вашего приложения

 global_search = searchItem.actionView as MaterialSearchBar
  

Потому что searchItem.actionView всегда возвращается null , а global_search тип — MaterialSearchBar (ненулевой тип). Вы присваиваете значение null ненулевому типу, из-за чего происходит сбой вашего приложения.

Вы можете изменить свой код на

 var global_search: MaterialSearchBar? = null

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.base_nav_drawer,menu)
    searchItem= menu?.findItem(R.id.srchbar_menu)!!
    global_search = searchItem.actionView as MaterialSearchBar?
    lastsuggestions=ArrayList<String>()
    loadSuggest()
    global_search.lastSuggestions=lastsuggestions
    return true
}
  

Но представление поиска не отображается в вашем приложении, похоже, третья сторона не поддерживает интеграцию в пункт меню с помощью app:actionViewClass .

Вот обходное решение, которое вы можете попробовать.

https://github.com/mancj/MaterialSearchBar/issues/107

Ответ №2:

Скорее всего, ваш член ActionView равен null, и вы, возможно, захотите использовать:

 global_search= searchItem.actionView as MaterialSearchBar?
  

или в определении что-то вроде этого:

 var global_search:MaterialSearchBar?= searchItem.actionView 
  

PS. Было бы полезно, если бы вы показали, как был определен global_search

Комментарии:

1. переменная global_search:MaterialSearchBar?= searchItem.ActionView у меня несоответствие типов, запрашивающее просмотр MaterialSearchBar found!

Ответ №3:

если это не поможет global_search= searchItem.actionView as? MaterialSearchBar

global_search вероятно, объявлено как ненулевое

Убедитесь, что это var global_search: MaterialSearchBar? = null