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

Android:将搜索查询返回到当前活动,android,search,Android,Search,我按照上面描述的步骤在记事本应用程序中实现搜索功能 我的问题是,当我完成搜索时,会打开一个新的活动来捕获我的搜索查询。但我真正想要的是将查询返回到当前活动,而不是启动新的活动 这可能吗 更新: AndroidManifest.xml <activity android:name="MyNotepad" android:label="@string/app_name"> <int

我按照上面描述的步骤在记事本应用程序中实现搜索功能

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

这可能吗

更新:

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>
即使我使用手机上的搜索按钮,它也不起作用。因此,我认为问题出在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>
<application>

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

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

</application>


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

在应用程序清单中,需要将当前活动定义为可搜索活动

<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>
然后,您可以使用字符串重新加载活动,如果是列表活动,您可以调用用于加载数据的代码,并在其中使用字符串。

我在“您可以使用字符串重新加载活动”之后,终于解决了这个问题。因此,请先阅读Lachlan的帖子,然后采取以下3个步骤“重新加载您的活动”:

  • 在ApplicationContext中保存查询字符串
  • 完成新打开的搜索活动
  • 覆盖OnResume,获取刚刚保存的查询字符串,然后刷新列表 列表活动中的代码:

    private void handleIntent(Intent intent) {
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String searchText = intent.getStringExtra(SearchManager.QUERY);
            ((MyApp)this.getApplicationContext()).setSearchText(searchText);
            this.finish();
        }
    }
    
    protected void onResume() {
        super.onResume();
    
        String searchText = ((MyApp)this.getApplicationContext()).getSearchText();
        //refresh your list here...
    }
    
    MyApp类:(这个原始想法来自这里:)


    不要忘记在清单文件中将属性
    android:name=“.MyApp”
    添加到您的应用程序中。祝你好运

    如果在SearchView上设置了
    SearchView.OnSuggestionListener
    ,并且重写的方法返回true(),则不会启动新活动。您可以在
    onCreateOptions菜单()
    实现中执行此操作,如下所示:

        searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
            @Override
            public boolean onSuggestionSelect(int position) {
                return true;
            }
    
            @Override
            public boolean onSuggestionClick(int position) {
                CursorAdapter selectedView = searchView.getSuggestionsAdapter();
                Cursor cursor = (Cursor) selectedView.getItem(position);
                int index = cursor.getColumnIndexOrThrow(SearchManager.SUGGEST_COLUMN_TEXT_1);
                searchView.setQuery(cursor.getString(index), true);
                return true;
            }
        });
    
    无需将活动强制为singleTop或其他黑客。

    简要说明:

  • android:launchMode=“singleTop”
    添加到
    AndroidManifest.xml中的
    可搜索活动定义中
  • 可搜索活动中执行
    onNewIntent
    ,并在那里处理搜索

  • 在清单文件中,添加:

    android:launchMode="singleTop"
    
    到您的搜索活动。然后,让您的搜索活动实现SearchView.OnSuggestionListener 最后:

    mSearchView.setOnSuggestListener(this)
    

    通过这种方式,您可以在不创建搜索活动新实例的情况下处理建议单击事件。

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

    <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>
    
    android:launchMode="singleTop" 
    
    因此,您的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" >
    

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

    “标准” “单顶” “单一任务” “单实例”

    “标准”是默认值。这四个值分为两组:

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

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

    “单顶”:


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

    我也面临同样的问题,然后我写了这段代码,它解决了我的问题

    在您的活动中实施这一点

    **implements SearchView.OnQueryTextListener, SearchView.OnCloseListener**
    
    在类中添加此函数:

    private void setupSearchView()
            {
    
                searchView.setIconifiedByDefault(true);
    
                SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
                if (searchManager != null)
                    {
                        List<SearchableInfo> searchables = searchManager.getSearchablesInGlobalSearch();
    
                        // Try to use the "applications" global search provider
                        SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
                        for (SearchableInfo inf : searchables)
                            {
                                if (inf.getSuggestAuthority() != null && inf.getSuggestAuthority().startsWith("applications"))
                                    {
                                        info = inf;
                                    }
                            }
                        searchView.setSearchableInfo(info);
                    }
    
                searchView.setOnQueryTextListener(this);
                searchView.setOnCloseListener(this);
            }
    
    这将彻底解决你的问题

    快乐编码

    我只是用这个:-

    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;
            }
    });
    

    当您必须在listview中搜索并且必须筛选出项目时,最好使用此选项。我从不使用清单文件实现搜索功能。这两种方法可以完成所有工作。

    是的,这是可能的。如果您提供您当前的代码,我们可以给出更具体的答案。您好,成功了吗?我也在寻找同样的东西。太遗憾了,我没有足够的代表,否则我很乐意为这个问题增加一笔奖金。嗨,鲁伊沃,你能详细说明你的答案吗?我相信这里最重要的一点是使用
    android:launchMode=“singleTop”
    。如果您的可搜索活动已经位于活动堆栈顶部,Android将不会启动新活动。您将在当前活动中收到搜索意图(通过
    onNewIntent
    )。感谢您的回答,因为我只使用android:launchMode=“singleTop”。我已尝试将查询和查询结果活动设置为相同的活动。声明为
    singleTop
    ,AppCompativeActivity仍然没有收到任何意图@onNewIntent()。所以我试试这个,它很管用!通过实现
    实现SearchView.OnQueryTextListener
    ,您可以更紧密地与SearchView合作。
    **implements SearchView.OnQueryTextListener, SearchView.OnCloseListener**
    
    private void setupSearchView()
            {
    
                searchView.setIconifiedByDefault(true);
    
                SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
                if (searchManager != null)
                    {
                        List<SearchableInfo> searchables = searchManager.getSearchablesInGlobalSearch();
    
                        // Try to use the "applications" global search provider
                        SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
                        for (SearchableInfo inf : searchables)
                            {
                                if (inf.getSuggestAuthority() != null && inf.getSuggestAuthority().startsWith("applications"))
                                    {
                                        info = inf;
                                    }
                            }
                        searchView.setSearchableInfo(info);
                    }
    
                searchView.setOnQueryTextListener(this);
                searchView.setOnCloseListener(this);
            }
    
    @Override
        public boolean onCreateOptionsMenu(Menu menu)
            {
                MenuInflater inflater = getMenuInflater();
                inflater.inflate(R.menu.menu, menu);
                //restoreActionBar();
                // Associate searchable configuration with the SearchView
                //SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
                searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
                //searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
                setupSearchView();
                return super.onCreateOptionsMenu(menu);
            }
    
    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;
            }
    });