9

我已经坚持了一段时间了。我已经查看了其他答案,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

4 回答 4

13

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

<meta-data
          android:name="android.app.default_searchable"
          android:value="com.example.search.SearchableActivity" />
于 2016-10-01T15:52:39.247 回答
4

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

不要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是提供搜索对话框的活动(也可以是搜索小部件),SearchableActivity是在用户请求搜索并被onSearchRequested()调用后开始的活动。

于 2015-06-11T15:43:20.407 回答
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>

谢谢!

于 2013-06-26T04:54:48.873 回答
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>
于 2013-06-26T04:23:16.973 回答