MenuItemCompat.getActionView always returns null
Finally I found the solution.
Changing namespace of
actionViewClass
fromandroid:actionViewClass
toapp:actionViewClass
Implementing
android.support.v7.widget.SearchView.OnQueryTextListener
interface for current activity.Directly use
setOnQueryTextListener
instead ofSearchViewCompat.setOnQueryTextListener
@Overridepublic boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); if (searchView != null) { searchView.setOnQueryTextListener(this); } return super.onCreateOptionsMenu(menu);}
In my case it was ProGuard file. You need to add this line:
-keep class android.support.v7.widget.SearchView { *; }
For me, an incorrect menu.xml
namespace import caused this problem.
My original menu.xml
:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/tools"> <item android:id="@+id/action_search" android:title="@string/map_option_search" android:icon="@drawable/ic_action_search" app:showAsAction="collapseActionView|ifRoom" app:actionViewClass="android.support.v7.widget.SearchView"/></menu>
It looks like the xmlns:app="http://schemas.android.com/tools"
was causing MenuItemCompat.getActionView()
to return null
. Changing this import to xmlns:app="http://schemas.android.com/apk/res-auto"
fixed the problem.
New working menu.xml
:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_search" android:title="@string/map_option_search" android:icon="@drawable/ic_action_search" app:showAsAction="collapseActionView|ifRoom" app:actionViewClass="android.support.v7.widget.SearchView"/></menu>