Android 辅助搜索:搜索按钮不会调用可搜索的 Activity(其他解决方案没有帮助) [英] Android assisted Search: The search button does not invoke the searchable Activity (Other Solutions did not help)

查看:16
本文介绍了Android 辅助搜索:搜索按钮不会调用可搜索的 Activity(其他解决方案没有帮助)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I wrote this small test application to demonstrate the problem, that is the searchable activity is not started when the user presses the search button on the keyboard.

我一直在关注开发者指南,但是从我的网络搜索中,事实证明官方开发者指南遗漏了一些要点. 从我的 SO 搜索中(没有帮助):

I have been following the developer guides, but from my web search, it turns out that the official developer guide misses some points. From my SO search (which did not help):

  • 参考 1: 通过添加标签解决这清单中的元素.我也调查了示例用户词典"的清单(我不知道在哪里可以在线查找示例,或者我会链接到它).这个标签在应用程序元素.

  • Reference 1: Solved by Adding tag in the element in the manifest. I also looked into the manifest of the sample "User Dictionary" (I don't know where can I find the samples online, or I would link to it). This tag is there in the application element.

参考 2: 中的android:label"和android:hint"res/xml/searchable.xml 必须是对字符串资源的引用,而不是硬编码字符串.我的是.

Reference 2: The "android:label" and "android:hint" in res/xml/searchable.xml must be references to string resources and not hard coded strings. Mine are.

参考 3: 添加一个标签"android:name="android.app.default_searchable" " (和 "android:value="<.searchable-activity-name>" ") 在清单中将开始搜索的活动.试过这似乎不起作用.

Reference 3: Add a tag with "android:name="android.app.default_searchable" " (and " android:value="<. searchable-activity-name>" ") in the manifest in the Activity from where the search is going to be initiated. Tried this, did not seem to work.

参考文献 4:您的 Searchable 活动必须执行某些操作 - 并且实际上显示结果."我的确实如此,它通过ACTION_SEARCH 动作,并传递检索到的搜索查询字符串从意图到名为performSearch(string)"的方法在文本视图中显示字符串.

Reference 4: "Your Searchable activity has to do something - and actually display results." Mine does, it receives the intent with the ACTION_SEARCH action, and passes the search query string retrieved from the intent to a method named "performSearch(string)" which displays the string in a textview.

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

代码: MainActivity.java - 有一个 SearchView - 用户输入查询并按下键盘上的搜索按钮.

Code: MainActivity.java - Has a single SearchView - the user enters the query and presses the Search button on the keyboard.

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

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

activity_test_two.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:我用搜索对话而不是搜索小部件编写了一个类似的应用程序,这很疯狂,效果很好.


EDIT 1: it's crazy that I wrote a similar app with the search dilogue instead of the search widget, that works perfectly.

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

I tried to debug it in Eclipse but debugging stops because the TestTwoActivity (the searchable activity) simply won't start.

推荐答案

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

I'm not sure if you've forgotten to add it but your MainActivity misses setting the searchable info on the 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 元标记的问题.它似乎只在使用完整路径(跳过风味)进行搜索活动时才有效,例如:

I've had problems with the default_searchable meta-tag, when using flavors. It seemed to only work when using the full path (skipping the flavor) to the search activity e.g.:

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

这篇关于Android 辅助搜索:搜索按钮不会调用可搜索的 Activity(其他解决方案没有帮助)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆