2013-06-26 52 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> 

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

感谢。尝试在'meta-data'中添加'android:value ='。SearchableActivity'但没有帮助。 – neo108

+0

嗨试试覆盖onNewIntent() –

2

得到它的工作。

的解决方案是移动meta-dataactivity标签外部和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

除非您希望应用程序中的每个活动都提供搜索对话框,否则不必将元数据移动到活动标记之外。它可能不适用于你的原因是因为你把元数据放在错误的活动中,并将它移到外面解决问题。

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

它给没有错误,但不工作:

不要活动调用它像这样混淆ResearchActivity。工作示例:

<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

Tomek给出了正确的答案我有主要活动和可搜索活动的单独活动我期望主要活动可以调用可搜索活动我认为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

它解决了我的问题 –