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<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/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_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>

Ответ 1

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

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

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

ИЗМЕНИТЬ

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

<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)));

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

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

<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>

Ответ 2

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

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

Ответ 3

Сначала проверьте, что вы используете приложение пространство имен для actionViewClass.

android:actionViewClass="android.support.v7.widget.SearchView" - это выбросы NPE

app:actionViewClass="android.support.v7.widget.SearchView" -use this

и второй

Проверьте, используете ли вы те же searchView в menu.xml и в Деятельности

Ответ 4

У меня была очень похожая проблема, когда следующая строка возвращала 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">

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

android:actionViewClass="android.widget.SearchView"