Android:将搜索查询返回到当前活动

Chr*_*ang 46 search android

我按照http://developer.android.com/guide/topics/search/search-dialog.html上描述的步骤在我的记事本应用程序中实现搜索功能.

我的问题是,当我完成搜索时,新的活动会打开捕获我的搜索查询.但我真正想要的是,查询返回到当前活动而不是开始新活动.

这可能吗?

更新:

AndroidManifest.xml中


<activity android:name="MyNotepad"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <action android:name="android.intent.action.SEARCH"></action>
            </intent-filter>
            <meta-data android:resource="@xml/searchable" android:name="android.app.searchable"></meta-data>
        </activity><activity android:name="Preferences" android:label="Preferences" >
</activity>

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>

JAVA代码


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_pad);
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        Toast.makeText(getApplicationContext(), query, Toast.LENGTH_LONG).show();
    }
}


@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    switch(item.getItemId())
    {
        case R.id.menuItemSearch:
            startSearch("", false, null, false);
    break;
    }
    return true;
}

即使我使用手机上的搜索按钮,它也不起作用.我因此认为问题出在AndroidManifest.xml中

Lac*_*nis 62

在Application Manifest中,您需要将当前活动定义为可搜索的活动.

<activity android:name="BrowseItems" android:label="@string/browseitems"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <meta-data android:name="android.app.searchable"
                android:resource="@xml/itemsearchable" />
</activity>
Run Code Online (Sandbox Code Playgroud)

然后使用以下代码,该代码来自http://developer.android.com/guide/topics/search/search-dialog.html#LifeCycle

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);
    handleIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      // Do work using string
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用该字符串重新加载您的活动,如果它是一个列表活动,您可以调用您用于加载数据的代码并使用其中的字符串.

  • 我相信这里最重要的一点是使用`android:launchMode ="singleTop"`.如果您的可搜索活动已经位于活动堆栈之上,则Android将不会启动新活动.您将在当前活动的活动中收到搜索意图(通过`onNewIntent`). (51认同)

Est*_*los 18

在您的可搜索活动中添加到AndroidManifest.xml:

android:launchMode="singleTop" 
Run Code Online (Sandbox Code Playgroud)

所以,你的AndroidManifest.xml看起来像:

<activity android:name="MyNotepad"
              android:label="@string/app_name"
              android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="android.intent.action.SEARCH"></action>
        </intent-filter>
        <meta-data android:resource="@xml/searchable" android:name="android.app.searchable"></meta-data>
    </activity><activity android:name="Preferences" android:label="Preferences" >
Run Code Online (Sandbox Code Playgroud)

原因:

这篇文章:

活动启动模式有四个有效值:

"standard""singleTop""singleTask""singleInstance"

'标准'是默认值.这四个值分为两组:

'standard'和'singleTop'可以实例化多个活动实例,实例将保留在同一个任务中.对于"singleTask"或"singleInstance",活动类使用单例模式,该实例将是新任务的根活动.让我们检查每个值:"标准":

可以实例化活动类的多个实例,并且可以将多个实例添加到同一任务或不同任务.这是大多数活动的共同模式.

"singleTop":

与"标准"的区别在于,如果活动实例已存在于当前任务的顶部且系统路由意图此活动,则不会创建新实例,因为它将触发onNewIntent()方法而不是创建新对象.


kha*_*val 5

我只是用这个:

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String s) {
            //on submit
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s) {
            //get all text changes
            return false;
        }
});
Run Code Online (Sandbox Code Playgroud)

当您必须在整个列表视图中进行搜索并且必须过滤出项目时,最好使用此方法。我从未使用清单文件实现搜索功能。这两种方法可以完成所有工作。


Rui*_*ivo -1

只需添加

<application>

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

   <!-- All your activities, service, etc. -->

</application>
Run Code Online (Sandbox Code Playgroud)

在 android_manifest.xml 文件中,其中 #Activity_Name 是处理搜索的活动的名称。