Android – NullPointerException в SearchView в панели действий

У меня возникла проблема с попыткой добавить виджет SearchView в ActionBar в мою активность – я получаю нулевое значение при вызове 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 workflowList = new ArrayList(); for (String s : testData) { workflowList.add(s); } ArrayAdapter workflowAdapter = new ArrayAdapter(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 / searchable.xml:

   

Меню / options_menu.xml:

     

Попробуйте заменить строку с ошибкой:

 mSearchMenuItem = menu.findItem(R.id.action_search); mSearchView = (EnglishVerbSearchView) MenuItemCompat.getActionView(mSearchMenuItem); 

Где R.id.action_search – это идентификатор вашего элемента поиска в меню.

РЕДАКТИРОВАТЬ

Ваш манифест должен выглядеть так:

             

Способ вызова setSearchableInfo :

 mSearchView.setSearchableInfo(searchManager.getSearchableInfo( new ComponentName(getApplicationContext(), SearchResultActivity.class))); 

EDIT 2

Убедитесь, что ваш XML-файл меню похож на него (обратите внимание на эти 2 атрибута с yourapp пространства имен yourapp – это необходимо, если вы используете библиотеку сопоставления):

    

У меня было похожее, похожее на мои выпуски, но не мои отладочные сборки при переключении на библиотеку поддержки v21. Оказалось, что проблема обфускации и добавление этой строки в файл proguard-rules.txt исправлено:

 -keep class android.support.v7.widget.SearchView { *; } 

Сначала проверьте, что вы используете пространство имен приложений для 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 , я поменял родителя Theme.AppCompat.Light на Theme.AppCompat.Light

    

Я думаю, что вы занимаете FragmentActivity , вам нужно расширить ActionBarActivity

Для тех, кто все еще ищет, я следовал всему, что было выше, и, похоже, не мог добиться успеха. Я завернул мою searchView.setSearchableInfo … в нулевой проверке и вуаля! Он бежал так же, как должен.

 if (searchView != null) { searchView.setSearchableInfo(searchManager.getSearchableInfo( new ComponentName(getApplicationContext(), SearchActivity.class))); } 

для меня, это правильный ответ: В меню / options_menu.xml используйте это:

 app:actionViewClass="android.support.v7.widget.SearchView" 

У меня такая же проблема. Мое решение: заменить android:actionViewClass="android.support.v7.widget.SearchView" с

 android:actionViewClass="android.widget.SearchView" 
  • Как удалить текст заголовка из Android ActionBar?
  • Как resize панели действий
  • Как выровнять название в центре ActionBar в теме по умолчанию (Theme.Holo.Light)
  • Как настроить кнопку «Назад» на ActionBar
  • Меню переполнения команды в ActionBarSherlock
  • Не удалось загрузить AppCompat ActionBar с неизвестной ошибкой в ​​студии Android.
  • Как отключить историю совместного использования при использовании ShareActionProvider?
  • Цвет текста ActionBar
  • Управление навигационной панелью и обратной кнопкой панели инструментов из fragmentа в андроиде
  • Полноэкранная тема для AppCompat
  • Кнопка «Назад» на панели действий
  • Interesting Posts

    Как можно найти способ изменения раскладки клавиатуры пользователя?

    Как я могу создать поле со списком WPF шириной самого широкого элемента в XAML?

    Spring 3.0 MVC binding Enums Case Sensitive

    Как слушать клавиатуру в фоновом режиме и стрелять по нажатию клавиши по требованию?

    Как переключить JPanels внутри JFrame

    Точный поиск фразы с использованием Lucene?

    Использование списка в качестве источника данных для DataGridView

    Автоматическое обновление браузера при изменении определенного файла в каталоге?

    Как удалить запись контекстного меню «3D-печать с помощью 3D Builder» в Windows 10?

    Изменение размера окон после изменения разрешения экрана

    Сериализация экземпляра classа для JSON

    Внешняя папка вывода в eclipse

    Встроенный код в главном теге – ASP.NET

    Какое лучшее приложение для нескольких мониторов для Windows 7?

    Перенаправление команд командной оболочки в другую консольную оболочку

    Давайте будем гением компьютера.