Android-NullPointerException на SearchView в панели действий
У меня возникла проблема при попытке добавить виджет SearchView в панель действий в моей деятельности - я получаю нулевое значение при вызове getActionView, чтобы получить мой объект SearchView.
Я следовал руководству разработчика Android, а также прошел через тонну вопросов SO, а также некоторые другие ссылки в интернете; все безрезультатно. Это может быть что-то простое, но я не смог этого понять - мне кажется, что мой код в основном такой же, как у google (кроме изменения некоторых имен и т.д. но это все равно не сработает.
Любая помощь будет признательна.
Ниже приведены соответствующие биты кода. Пожалуйста, дайте мне знать, если что-то неясно, если у вас есть какие-либо идеи относительно того, что может быть неправильно.
Код деятельности:
private ListView workflowListView;
private DrawerLayout drawerLayout;
private ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_workflow_list);
workflowListView = (ListView) findViewById(R.id.workflowListView);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerList = (ListView) findViewById(R.id.drawer_list);
drawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
drawerLayout, /* DrawerLayout object */
R.drawable.ic_launcher, /* nav drawer icon to replace 'Up' caret */
R.string.app_name, /* "open drawer" description */
R.string.app_name /* "close drawer" description */
) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
// getActionBar().setTitle("Closed drawer");
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
// getActionBar().setTitle("Open drawer");
}
};
drawerLayout.setDrawerListener(drawerToggle);
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setIcon(android.R.color.transparent);
String[] testData = {"a", "b", "c", "d"};
ArrayList<String> workflowList = new ArrayList<String>();
for (String s : testData) {
workflowList.add(s);
}
ArrayAdapter<String> workflowAdapter = new ArrayAdapter<String>(this.getApplicationContext(), R.layout.workflow_list_item, workflowList);
workflowListView.setAdapter(workflowAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.workflow_list, menu);
inflater.inflate(R.menu.options_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
// The below line returned null even though it was used in Google sample code
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return super.onCreateOptionsMenu(menu);
}
Xml / с возможностью поиска.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_hint"
android:includeInGlobalSearch="false" />
Меню / options_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" >
<item android:id="@+id/search"
android:title="@string/search_title"
android:icon="@drawable/ic_action_search"
android:showAsAction="always|collapseActionView"
android:actionViewClass="android.support.v7.widget.SearchView" />
</menu>
8 ответов:
Попробуйте заменить неудачную строку на:
mSearchMenuItem = menu.findItem(R.id.action_search); mSearchView = (EnglishVerbSearchView) MenuItemCompat.getActionView(mSearchMenuItem);
, где ID-Р..action_search-это идентификатор вашего пункт поиск в меню.
EDIT
Ваш манифест должен выглядеть так:
<activity android:name="com.bronzelabs.twc.activities.WorkflowListActivity" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.Light" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activities.SearchResultActivity" android:theme="@style/Theme.AppCompat.Light" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" android:value=".activities.SearchResultActivity" /> </activity>
Способ, которым вы называете
setSearchableInfo
:mSearchView.setSearchableInfo(searchManager.getSearchableInfo( new ComponentName(getApplicationContext(), SearchResultActivity.class)));
EDIT 2
Убедитесь, что ваш XML-файл меню выглядит так (Обратите внимание на эти 2 атрибута с пространством имен
yourapp
- это необходимо при использовании библиотеки compat):<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yourapp="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/action_search" android:title="@string/action_search" android:icon="@drawable/action_search" yourapp:showAsAction="always|collapseActionView" yourapp:actionViewClass="android.support.v7.widget.SearchView" /> </menu>
У меня был похожий, вероятно, который появился в моих сборках выпуска, но не в моих отладочных сборках при переключении на библиотеку поддержки v21. Оказалось, что это проблема запутывания, и добавление этой строки к моим правилам proguard.txt-файл исправил это:
-keep class android.support.v7.widget.SearchView { *; }
Сначала проверьте, что вы используете пространство именapp дляactionViewClass .
android:actionViewClass="android.support.v7.widget.SearchView"
-это бросает NPE
app:actionViewClass="android.support.v7.widget.SearchView"
-Используйте этоИ второй
Проверьте, используете ли вы то же самое
searchView
вmenu.xml
и в вашей деятельности
У меня была очень похожая проблема, когда следующая строка возвращала null
SearchView searchView = (android.support.v7.widget.SearchView)MenuItemCompat.getActionView(searchMenuItem);
Исправление было в моем файле
styles.xml
, я изменил Родительский файл моей AppTheme наTheme.AppCompat.Light
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light">
Для тех, кто все еще искал, я следовал за всем выше и, казалось, не мог заставить вещи идти. Я завернул свой searchView.setSearchableInfo... в нулевой проверке и вуаля! Все шло так, как и должно было идти.
if (searchView != null) { searchView.setSearchableInfo(searchManager.getSearchableInfo( new ComponentName(getApplicationContext(), SearchActivity.class))); }