当前位置: 首页 > 知识库问答 >
问题:

Android辅助搜索:搜索按钮不会调用可搜索的活动(其他解决方案没有帮助)

太叔望
2023-03-14

我编写了这个小型测试应用程序来演示问题,即当用户按下键盘上的搜索按钮时,可搜索的活动未启动。

我一直在关注开发人员指南,但从我的网络搜索中,发现官方开发人员指南遗漏了一些要点。从我的SO搜索(没有帮助):

> < li>

参考1:通过在清单的元素中添加标记来解决。我还查看了示例“用户字典”的清单(我不知道在网上哪里可以找到示例,或者我会链接到它)。这个标签在application元素中。

引用2:RES/XML/searchable . XML中的“android:label”和“android:hint”必须是对字符串资源的引用,而不是硬编码的字符串。我的是。

参考3:添加带有“android:name=”android.app的标签。default_searchable“”(和“android:value=”

参考文献 4:“您的可搜索活动必须执行某些操作 , 并实际显示结果。我的是,它接收带有ACTION_SEARCH操作的意图,并将从意图检索到的搜索查询字符串传递给名为“performSearch(string)”的方法,该方法在文本视图中显示字符串。

那么我做错了什么,我能做些什么来解决这个问题呢?

代码:主要活动.java - 具有单个 SearchView - 用户输入查询并按键盘上的“搜索”按钮。

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

测试TwoActivity.java

    public class TestTwoActivity extends Activity {
        TextView tv;
        private static final String TAG = TestTwoActivity.class.getSimpleName();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test_two);

            /**
             * The following code enables assisted search on the SearchView by calling setSearchableInfo() and passing it our SearchableInfo object.
             */
            SearchView searchView = (SearchView) findViewById(R.id.searchActivity_searchView);
            // SearchManager => provides access to the system search services.

            // Context.getSystemService() => Return the handle to a system-level
            // service by name. The class of the returned object varies by the
            // requested name.

            // Context.SEARCH_SERVICE => Returns a SearchManager for handling search

            // Context = Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android
            // system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching
            // activities, broadcasting and receiving intents, etc.

            // Activity.getComponentName = Returns a complete component name for this Activity 

            SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

            /**
             * If the search is executed from another activity, the query is sent to this (searchable) activity in an Intent with ACTION_SEARCH action.
             */
            // getIntent() Returns the intent that started this Activity
            Intent intent = getIntent();
            if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
                Log.i(TAG, "Search Query Delivered");//check
                String searchQuery = intent.getStringExtra(SearchManager.QUERY);
                performSearch(searchQuery);
            }

        }

        private void performSearch(String searchQuery) {
            //Just for testing purposes, I am simply printing the search query delivered to this searchable activity in a textview.
            tv = (TextView) findViewById(R.id.testTwoActivity_textView);
            tv.setText(searchQuery);
        }
}

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/searchViewHint" >
</searchable>

清单文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tests"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/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>
        </activity>

        <activity
            android:name=".TestTwoActivity"
            android:label="@string/title_activity_test_two" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH"/> <!-- Declares the activity to accept ACTION_SEARCH intent -->
            </intent-filter> 
                <meta-data 
                    android:name="android.app.searchable"
                    android:resource="@xml/searchable" /> <!-- Specifies the searchable configuration to use --> 
        </activity>

        <!-- Points to searchable activity so the whole app can invoke search. -->
        <meta-data android:name="android.app.default_searchable"
                   android:value=".TestTwoActivity" />

    </application>

</manifest>

布局:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"

    android:orientation="vertical"

    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="com.tests.MainActivity" >

    <android.support.v7.widget.SearchView
        android:id="@+id/searchActivity_searchView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         /> 

</LinearLayout>

活动_测试_二. xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"

    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="${relativePackage}.${activityClass}" >

    <android.support.v7.widget.SearchView
        android:id="@+id/searchActivity_searchView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         /> 

    <TextView
        android:id="@+id/testTwoActivity_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

编辑1:我写了一个类似的应用程序,用搜索dilogue而不是搜索小工具,这太疯狂了,它工作得非常好。

我尝试在Eclipse中调试它,但调试停止,因为TestTwoActive(可搜索活动)根本无法启动。

共有1个答案

哈襦宗
2023-03-14

我不确定您是否忘记添加它,但您的MainActivity未在SearchView上设置可搜索信息:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SearchView searchView = (SearchView) findViewById(R.id.searchActivity_searchView);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
}

作为旁注:

在使用风格时,我在元标记default_searchable遇到了问题。它似乎仅在使用搜索活动的完整路径(跳过风格)时才有效,例如:

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

 类似资料:
  • 问题内容: 我编写了这个小型测试应用程序来演示该问题,即当用户按下键盘上的搜索按钮时,可搜索活动未启动。 我一直在遵循开发人员指南,但是从我的网络搜索中 发现,官方开发人员指南缺少一些要点。 从我的SO搜索(没有帮助): 参考1:通过在清单中的元素中添加标签来解决。我还查看了示例“用户字典”的清单(我不知道在哪里可以在线找到示例,或者我可以链接到它)。该标签在application元素中。 参考2

  • 我想通过一个包含EditText和按钮的水平LinearLayout创建一个自定义SearchView。用户在EditText中输入搜索查询。 通常,当我们使用SearchView时,我们 > 通过将可搜索活动配置为在清单意向来声明该活动。 通过使用清单中的meta元素来声明我们的可搜索配置文件。 通过配置 SearchView 启用系统辅助搜索(其中系统将搜索查询传递给可搜索活动、提供语音搜索、

  • 所以我尝试在我的应用程序中实现一个搜索功能。我在应用程序栏中添加了一个SearchView,并配置了清单,将意图指向正确的活动。但我有一个特殊的情况:我想在SearchView生成的意图中添加额外的信息,以传递给我的SearchableActivity(在我的例子中是SearchEventsActivity类)。为此,我想让我的MainActivity类成为可搜索的,它可以通过捕捉意图,将额外的信

  • 我得活动: A-Main Activity(类似于登录屏幕),在进入任何其他Activity时finish() C=其他用户内容 当我进入A>B>C,按home,从launcher启动应用程序时,我看到了C与后堆栈恢复的B>C(顶部),这里没有问题 当我转到A>B>C,按home,启动应用程序从谷歌搜索栏在主屏幕上,我看到A,与背面堆栈B>C>A(顶部)。 问题是为什么会发生这种情况,我该如何修复

  • 我有大量相同类型的实体,每个实体都有大量属性,并且我只有以下两种选择来存储它们: 将每个项存储在索引中并执行多索引搜索 将所有enties存储在单个索引中,并且只搜索1个索引。 一般而言,我想要一个时间复杂度之间的比较搜索“N”实体与“M”特征在上述每一种情况!

  • 我们有一个自定义的职位类型hr priority,它有多个与之相关的自定义分类。这些分类法包含多个术语,每个帖子可以从这些分类法中分配1到多个术语。我们正在尝试设置一个过滤器,允许访问者在多个分类中通过这些术语的组合来搜索/过滤结果。 例如:文章"样本文章"在分类学"年份"中有术语"2018","组织"分类学中有术语"理事会成员","国家"分类学中有术语"加拿大"。文章“其他样本”中有“年份”一词