#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
.
Вот обходное решение, которое вы можете попробовать.
Ответ №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