Android – NullPointerException в SearchView в панели действий
У меня возникла проблема с попыткой добавить виджет SearchView в ActionBar в мою активность – я получаю нулевое значение при вызове getActionView для получения моего объекта SearchView.
Я следил за руководством разработчика Android, а также просмотрел тонну вопросов SO, а также некоторые другие ссылки в Интернете; все безрезультатно. Это может быть что-то простое, но я не смог понять это – мне кажется, что мой код в основном такой же, как у google (кроме изменения некоторых имен и т. Д.), Но он все равно не сработает.
Любая помощь будет оценена по достоинству.
- Как получить панель инструментов из fragmentа?
- Как resize текста заголовка в панели действий?
- Пользовательский прозрачный Android ActionBar
- Как изменить значок по умолчанию в SearchView, который будет использоваться в панели действий на Android?
- Изменение значка меню «Переполнение Android» программно
Ниже приведены соответствующие биты кода. Пожалуйста, дайте мне знать, если что-то неясно, если вы знаете, что может быть неправильным.
Код мероприятия:
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:
- Переключение между изображениями Android Navigation Drawer и Up caret при использовании fragmentов
- Как центрировать выравнивание заголовка ActionBar в Android?
- actionlayout на menuitem ничего не делает
- Почему мое раскрывающееся меню переполнения над панелью действий?
- Как перейти в одно и то же родительское состояние
- Не удается найти Theme.AppCompat.Light для новой поддержки Android ActionBar
- Как я могу реализовать пользовательскую панель действий с пользовательскими кнопками в Android?
- Как изменить значок меню в панели действий?
Попробуйте заменить строку с ошибкой:
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"