我正在尝试在操作栏中使用SearchView(仅用于一个片段),但SearchView始终返回null。
片段
import android.os.Bundle
import android.view.*
import androidx.appcompat.widget.SearchView
import androidx.fragment.app.Fragment
import com.StockMarketAlarms.StockAlarm.R
import com.google.firebase.auth.FirebaseAuth
class SearchFragment : Fragment() {
private lateinit var auth: FirebaseAuth
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.fragment_search, container, false)
setHasOptionsMenu(true)
return root
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.search_menu, menu)
val searchView: SearchView = menu.findItem(R.id.menuitem_search) as SearchView
searchView.setMaxWidth(Int.MAX_VALUE)
}
}
加载在扩展AppCompatActivity的tabactivity中
搜索菜单看起来像这样search_menu.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"
xmlns:tools="http://schemas.android.com/tools">
<android.support.v7.widget.SearchView
android:id="@+id/menuitem_search"
android:icon="@drawable/search_black_48"
app:actionViewClass="android.widget.SearchView"
android:title="@string/title_search"
app:searchIcon="@drawable/search_black_48"
app:showAsAction="collapseActionView|ifRoom"
app:queryBackground="@color/colorWhite"
app:iconifiedByDefault="false" />
</menu>
我不明白为什么它返回null,我尝试了很多。
Process: com.jfvh.stockalarm, PID: 1845
kotlin.TypeCastException: null cannot be cast to non-null type androidx.appcompat.widget.SearchView
at com.jfvh.stockalarm.activities.fragments.SearchFragment.onCreateOptionsMenu(SearchFragment.kt:48)
at androidx.fragment.app.Fragment.performCreateOptionsMenu(Fragment.java:2711)
at androidx.fragment.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManagerImpl.java:2711)
at androidx.fragment.app.Fragment.performCreateOptionsMenu(Fragment.java:2713)
at androidx.fragment.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManagerImpl.java:2711)
at androidx.fragment.app.FragmentController.dispatchCreateOptionsMenu(FragmentController.java:386)
at androidx.fragment.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:326)
at androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:94)
at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.onCreatePanelMenu(AppCompatDelegateImpl.java:2830)
at androidx.appcompat.app.AppCompatDelegateImpl.preparePanel(AppCompatDelegateImpl.java:1746)
at androidx.appcompat.app.AppCompatDelegateImpl.doInvalidatePanelMenu(AppCompatDelegateImpl.java:2026)
at androidx.appcompat.app.AppCompatDelegateImpl$2.run(AppCompatDelegateImpl.java:260)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
[search_menu.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"
xmlns:tools="http://schemas.android.com/tools">
<!-- tag name should be <item> -->
<item
android:id="@+id/menuitem_search"
android:icon="@drawable/search_black_48"
app:actionViewClass="android.widget.SearchView"
android:title="@string/title_search"
app:searchIcon="@drawable/search_black_48"
app:showAsAction="collapseActionView|ifRoom"
app:queryBackground="@color/colorWhite"
app:iconifiedByDefault="false"/>
</menu>
来源:https://developer.android.com/training/search/setup#add-sv