2013-06-26 4 views
9

Я немного застрял на этом. Я посмотрел на другие ответы на SO, но они не помогли мне решить мою проблему.Поиск Диалог не вызывается onSearchRequested()

Моя проблема заключается в том, что диалоговое окно поиска не вызывается onSearchRequested(). Я не могу понять, что происходит с моим поиском ...

Соответствующий код, как показано ниже ...

манифеста

<activity 
    android:name=".SearchableActivity" 
    android:label="@string/app_name" 
    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" /> 
</activity> 

/Рез/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" > 

</searchable> 

у меня есть строковые ресурсы, определенные в strings.xml.

SearchableActivity класс

public class SearchableActivity extends ListActivity { 

    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Log.d("SEARCH", "HERE"); 
      handleIntent(getIntent()); 
     } 

     public void onNewIntent(Intent intent) { 
      setIntent(intent); 
      handleIntent(intent); 
     } 

     public void onListItemClick(ListView l, View v, int position, long id) { 
      // call the appropriate detail activity 
     } 

     private void handleIntent(Intent intent) { 
      if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      String query = intent.getStringExtra(SearchManager.QUERY); 
      doSearch(query); 
      } 
     }  

     private void doSearch(String queryStr) { 
      Toast.makeText(getApplicationContext(), queryStr, Toast.LENGTH_LONG).show(); 
     } 

} 

Кусок кода в деятельности, которая ссылающегося поиск ...

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if(item.getTitle().equals("Search")) { 
     Toast.makeText(getApplicationContext(), "Search = "+onSearchRequested(), Toast.LENGTH_LONG).show(); 
     return onSearchRequested(); 
    } else { 
     return false; 
    } 
} 

onSearchRequested() возвращается true. Но SearchableActivity не вызывается. Любая помощь приветствуется.

спасибо.


ОБНОВЛЕНО

Ничего! Я понял!

Решение должно было перемещать meta-data за пределами метки activity и внутри тега application. Добавили ниже в качестве ответа для тех, кто сталкивается с этой проблемой.

Спасибо.

ответ

1

UPDATE

вы должны overrideonNewIntent()

изменения проявляются в

<activity 
    android:name=".SearchableActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.app.default_searchable" 
     android:resource="@xml/searchable" 
     android:value=".SearchableActivity" /> 
</activity> 
+0

Спасибо. Попробовал добавить «android: value =». SearchableActivity' в «метаданные», но не помог. – neo108

+0

эй попробуйте переопределить onNewIntent() –

2

Понял работает.

Решение было перемещать meta-data вне activity тега и внутри application тега, как показано ниже ...

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

<activity 
    android:name=".SearchableActivity" 
    android:label="@string/app_name" 
    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" /> 
</activity> 

Спасибо!

+3

Вы поблагодарили себя за ответ на свой вопрос? – SK9

+2

Это не сработало для меня ! –

+0

это будет работать, но не обязательно выставлять его за пределами тега активности. См. Мой ответ. – Tomasz

3

Вам не нужно перемещать метаданные вне тега активности, если вы не хотите, чтобы каждое действие в вашем приложении предоставляло диалоговое окно поиска.Причина, по которой это, вероятно, не сработала для вас, состоит в том, что вы помещаете метаданные в неправильную деятельность и перемещаете ее за пределы разрешенной проблемы.

Не следует путать с ResearchActivity деятельности, которая называет это следующим образом:

<activity 
     android:name=".SearchableActivity" 
     android:label="@string/title_activity_searchable" 
     android:launchMode="singleTop"> 
     <meta-data 
      android:name="android.app.default_searchable" 
      android:value=".SearchableActivity" /> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 

Это не дает никакой ошибки, но не работает. Рабочий пример:

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.AppTheme"> 
    <activity 
     android:name=".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.default_searchable" 
      android:value=".SearchableActivity" /> 
    </activity> 
    <activity 
     android:name=".SearchableActivity" 
     android:label="@string/title_activity_searchable" 
     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" /> 
    </activity> 
</application> 

MainActivity является деятельность, которая обеспечивает диалог поиска (это может быть также search widget) и SearchableActivity является деятельность, начиная после того, как пользователь запрашивает поиск и onSearchRequested() вызывается.

+0

Томек дал правильный ответ. У меня есть отдельные виды деятельности основного вида деятельности и поиска. Я ожидаю, что основная деятельность будет вызвана поисковой деятельностью. Android действительно сбивает с толку ** android.app.default_searchable ** и ** android.app.default_searchable ** с похожим названием, но с другим смыслом. Он просто запутался в новом программисте для Android. –

1

Вы должны объявить полный путь к поисковой активности,

<meta-data 
      android:name="android.app.default_searchable" 
      android:value="com.example.search.SearchableActivity" /> 
+1

Он решил мою проблему –