搜索对话框未调用onSearchRequested()

时间:2013-06-26 04:13:27

标签: android search-dialog

我现在已经坚持了一段时间。我在SO查看了其他答案,但他们没有帮助我解决我的问题。

我的问题是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标记内。已添加以下内容作为遇到此问题的人的答案。

感谢。

4 个答案:

答案 0 :(得分:7)

您需要声明搜索活动的完整路径

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

答案 1 :(得分:3)

搞定了。

解决方法是将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>

谢谢!

答案 2 :(得分:3)

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

请勿将ResearchActivity与调用它的Activity混淆:

    <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()后开始的活动。

答案 3 :(得分:1)

<强>更新

您必须override onNewIntent()

将清单改为

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