SearchView: getSearchableInfo возвращает ноль

Я пытаюсь реализовать поиск в своем приложении для Android. Существует два действия: MainActivity, где запускается поиск (через представление поиска на панели действий), и ResultsActivity, где обрабатывается поиск, а список пополняется результатами. Проблема в том, что метод getSearchableInfo, который я вызываю в onCreateOptionsMenu в основном действии, возвращает значение null, как будто к действию не был прикреплен файл searchable.xml. Я пробовал множество комбинаций расположения метаданных в манифесте, а также каждое решение, найденное в Интернете, и другие вопросы о стеке, но, похоже, ничего не работает. Это источники:

AndroidManifest.xml

 <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.AppCompat.Light" >

    <activity
        android:name="com.example.webparser.MainActivity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />

    </activity>


    <activity android:name="com.example.ResultsActivity" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>


    </activity>
     <meta-data
        android:name="android.app.default_searchable"
        android:value=".ResultsActivity" />

</application>

** MainActivity.java **

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    SearchManager searchManager = (SearchManager)  getSystemService(getApplicationContext().SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.search)
            .getActionView();
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getComponentName()));
    Log.d("Search:", searchManager.getSearchableInfo(getComponentName())
            .toString());
    return true;
}

** Результаты Активности.java **

private void handleIntent(Intent intent) {

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        elementi = new ArrayList<String>();
        for(Ricetta ricetta:ricette){
            if( ricetta.getNome().toLowerCase().matches(query) ){
                elementi.add(ricetta.getNome());
            }
        }


        adapter=new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                elementi);
        lista.setAdapter(adapter);
        Log.i("LOG:", "searching");
    }
}

** Доступный для поиска.xml **

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
/>

Обратите внимание, что я вставил Log.d там, где предполагается инициализировать представление поиска, и где называется getSearchableInfo, поэтому во время выполнения возникает исключение nullpointerexception, и приложение не запускается, но если этот Log.d удаляется, то все, кроме поиск работает (при нажатии ввода в поисковой строке ничего не происходит). Я думаю, что есть проблема с манифестом, но я не могу понять, что это такое. Кто-нибудь знает? Я также попытался запустить основное действие в singleTop, указав доступные для поиска теги метаданных на основное действие, но возникло то же исключение.


person Fabrizio Mele    schedule 30.01.2014    source источник


Ответы (3)


Я заметил, что вы используете меню, чтобы попытаться получить представление поиска вместо функции findViewById.

SearchView searchView = (SearchView) menu.findItem(R.id.search)
        .getActionView()

Должно быть больше похоже на это

SearchView searchView = (SearchView) findViewById(R.id.search);

Это даст вам SearchView, который вы ищете.

person Gplex314159    schedule 06.03.2014

Столкнулся с той же проблемой. Мне помогло следующее:

  • Это моя основная активность

    public boolean onCreateOptionsMenu(Menu menu) {       
      getMenuInflater().inflate(R.menu.menu_list_view_test, menu);
      SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
      MenuItem searchItem = menu.findItem(R.id.search);
      SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
      searchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName()) );
    return true;
    

Примечание. Убедитесь, что вы импортировали SearchView из Support.v7.widget (import android.support.v7.widget.SearchView;)

  • Это мой Menu.xml для MainActivity

    ‹ item android:id="@+id/search" android:title="Search" android:icon="@drawable/ic_action_search" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="android.support.v7. виджет.SearchView" />

person Santosh Pillai    schedule 11.02.2015

В моем случае у меня аналогичная настройка, только немного другая. У меня есть:

<meta-data android:name="android.app.default_searchable"
           android:value=".ResultsActivity" />

в моей основной деятельности. А также

<meta-data android:name="android.app.searchable"
           android:resource="@xml/searchable" />

а также

searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName));

должно сработать.

в моем ResultActivity. И я создаю имя компонента в своей MainActivity с помощью:

ComponentName componentName = new ComponentName(context, ResultActivity.class);

Примечание: будьте осторожны с макетом вашего элемента:

Используйте: app:actionViewClass="android.support.v7.widget.SearchView" если у вас проблемы с android:actionViewClass="android.support.v7.widget.SearchView"

person ninjahoahong    schedule 19.01.2016