2014-01-30 1 views
2

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

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

** ResultsActivity.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 где SearchView предполагается быть инициализирован, и где называется getSearchableInfo, поэтому во время выполнения NullPointerException поднимается, и приложение не запускается, но если этот журнал .d удаляется, то все, кроме поиска, работает (при нажатии enter в окне поиска ничего не происходит). Я думаю, что есть проблема с манифестом, но я не могу понять, что это такое. Кто-нибудь знает? Я также попытался запустить основное действие в singleTop, указывая на метатеги поиска с возможностью поиска на основное действие, но при этом возникает одно и то же исключение.

ответ

0

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

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

должно быть больше как этот

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

Это дало бы вам SearchView ты ищешь.

0

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

  • Это мой MainActivity

    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 (импорт android.support.v7.widget .SearchView;)

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

    < пункта андроид: идентификатор = "@ + идентификатор/поиск" андроид: название = "Поиск" андроид: значок = "@ вытяжка/ic_action_search" приложение: showAsAction = "ifRoom | collapseActionView" приложения: actionViewClass = «android.support.v7.widget.SearchView»/>

0

В моем случае у меня есть аналогичный набор вверх как раз немного по-другому у меня есть:.

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

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

в моем результате. И я создаю имя компоненты в моем MainActivity с:

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

Примечания: будьте осторожны с макетом пункта:

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