SearchView getActionView возвращает null
Это работало несколько дней назад, но внезапно оно прекратилось. Я просто хочу использовать виджет поиска панели действий, когда отображается определенный фрагмент.
Теперь я не могу получить SearchView
, теперь getActionView
всегда возвращает null.
searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_for_places">
</searchable>
Manifest.xml
<activity
android:name=".ui.activities.MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
<meta-data
android:name="android.app.default_searchable"
android:value=".ui.activities.MainActivity" />
</activity>
menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myapp="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search_place"
android:icon="@drawable/ic_2_action_search"
android:orderInCategory="1"
android:title="@string/title_search"
myapp:showAsAction="collapseActionView|ifRoom"
myapp:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
Фрагмент
...
setHasOptionsMenu(true);
...
@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
inflater.inflate(R.menu.menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search_place);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
SearchManager searchManager = (SearchManager) getBaseActivity().getSystemService(Context.SEARCH_SERVICE);
if (mSearchView != null) {
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
mSearchView.setIconifiedByDefault(true);
mSearchView.setOnQueryTextListener(this);
}
super.onCreateOptionsMenu(menu, inflater);
}
Ответы
Ответ 1
Сегодня у меня была такая же проблема, и я решил, что решил. Оказывается, я сделал пару вещей, которые не соответствовали контракту ActionBarCompat
:
- Каждое действие, использующее
ActionBarCompat
, должно < ActionBarActivity
вместо FragmentActivity
- Каждое действие, использующее
ActionBarCompat
, должно объявить свою тему как наследуемое от тем ActionBarCompat
.
Оба из тех, что я нашел, смотрели объяснение видео от Google.
Теперь мой searchView
больше не null
.
Ответ 2
У меня была такая же проблема, потому что в моем меню я использовал:
android:actionViewClass="android.widget.SearchView"
согласно документации Google.
Ну, получается, что если я использую AppCompatActivity, я должен использовать
app:actionViewClass="android.widget.SearchView"
вместо этого.
Надеюсь, это поможет кому-то.
Ответ 3
Если вы используете proguard, это возможный ответ: https://code.google.com/p/android/issues/detail?id=58508
Короче говоря, добавьте строку ниже в конфигурационный файл proguard proguard-rules.pro
.
-keep class android.support.v7.widget.SearchView { *; }
Ответ 4
Я исправил его: в меню xml я использовал пространство имен приложений:
app:showAsAction="collapseActionView|always"
app:actionViewClass="android.support.v7.widget.SearchView"
Учебник Android, https://developer.android.com/training/search/setup.html, использует андроид: showAs и android: actionView...
Ответ 5
Изменение импорта android.support.v7.widget.SearchView помогло мне
Ответ 6
Я был с той же ошибкой. И я сделал следующие вещи:
У меня есть действие, распространяющееся на FragmentActivity:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.feed, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
return true;
}
Searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_label"
android:hint="@string/search_hint" >
</searchable>
menu.xml:
<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"
tools:context="br.com.srtorcedor.FeedActivity">
<item android:id="@+id/action_search"
android:icon="@drawable/abc_ic_search"
android:title="@string/search_title"
android:showAsAction="always"
android:actionViewClass="android.widget.SearchView"/>
</menu>
AndroidManifest:
<activity
android:name=".FeedActivity"
android:icon="@drawable/ic_action_pins"
android:label="@string/title_activity_feed">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
Не могли бы вы проверить, работает ли он с вами?
Ответ 7
Сегодня я понял, что получаю null от вызова getActionView() на элементах, которые не были:
android:showAsAction="always"
Похоже, что они просто не надуваются правильно.
Ответ 8
Для меня работало следующее решение:
<?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"
tools:context="com.dev.ttburger.conttagem.BuscarProdutoActivity">
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="Buscar"
app:showAsAction="always"
app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
Изменить на:
<?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"
tools:context="com.dev.ttburger.conttagem.BuscarProdutoActivity">
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="Buscar"
app:showAsAction="always"
app:actionViewClass="android.SearchView"/>
</menu>
Ответ 9
Я добавил это тоже:
setHasOptionsMenu(true);
Работа с этим и ответом @maxandron