【问题标题】:Customization of the Android SearchView componentAndroid SearchView 组件的自定义
【发布时间】:2012-08-24 15:25:38
【问题描述】:

我需要一个组件,它允许用户输入一个值并通过连接到 Internet 上的某个站点来检查它是否存在,并在用户输入时显示建议。我想为此使用 SearchView 组件,但发现它有一些限制:

  1. 开发人员必须创建一个单独的活动来处理搜索。我不想使用其他活动,我只想连接到网站并检查用户输入的内容是否存在。

  2. 为了使用建议机制,开发人员必须构建一个内容提供者。同样,我不想连接到任何数据库,我只需要使用标准 HTTP 消息向站点发送搜索查询,为此我不需要内容提供程序。

所以我的问题是:有没有办法将 SearchView 组件与我需要的自定义一起使用,还是我必须找到符合组件要求的丑陋变通办法,但也要满足我的需要?

谢谢。

【问题讨论】:

    标签: android android-searchmanager


    【解决方案1】:

    您不应该在您的 UI 线程上运行 HTTP 请求,因为您无法保证它们会及时完成,因此它们可能会被锁定。您至少需要在可运行或 ASyncTask 中运行它。

    如果您想要一种快速的肮脏黑客方式,您可以创建一个 ListFragment 来显示您的自定义建议。然后创建一个 OnQueryTextListener(或让您的 Activity 实现它)在 SearchView 上设置它。然后在 Listener 的方法 onQueryTextChange(String text) 中生成建议(如果从 web 服务获取,让这个方法启动你的 ASyncTask),然后用数据更新 ListFragment 适配器

    【讨论】:

    • 好的,但是如果我使用 ListFragment,那么我根本不需要使用 SearchView。我可以使用 EditText 和 OnKeyListener 来获得相同的效果。问题是是否有办法连接到 SearchView 并使用它的建议机制和 UI,但是以一种定制的方式从我想要的任何来源获取建议,不一定是内容提供者。
    • 只需制作您自己的 ContentProvider 即可从您想要的任何位置(不一定是数据库)返回数据。或者子类化 SearchView 并重新编写适当的方法以从您想要的位置接受数据并适当地显示它(您可能必须查看源代码才能了解这是如何完成的)
    • 好的,但是可搜索的活动呢?我不想使用它,但我必须定义它。我可以构建一个没有真正显示的虚拟活动吗?
    • 所以您想使用 SearchView 但又想跳过障碍来避免设置它需要的所有组件?似乎您不想实际使用 SearchView。为什么不使用 AutoCompleteTextView 呢?您可以将适配器设置为您的自定义建议
    【解决方案2】:

    这很容易。您只需要使用 Google 的搜索功能,当用户长按菜单按钮时,它会加载一个搜索文本框,您可以在其中输入搜索查询以在您的应用中进行搜索。

    可搜索的应用文件必须包含该元素作为根节点并指定一个或多个属性。例如

    <?xml version="1.0" encoding="utf-8"?>
    <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_label"
    android:hint="@string/search_hint" >
    </searchable>

    然后声明一个活动来接受 ACTION_SEARCH 即

    <application ... >
    <activity android:name=".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>

    现在我们需要控制查询及其执行方式。 我将它用于我的应用程序。

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

    // Get the intent, verify the action and get the query
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
    String query = intent.getStringExtra(SearchManager.QUERY);
    doMySearch(query);
    }
    }

    【讨论】:

    • 我想你没有理解我的问题...我知道如何以标准方式使用搜索小部件,但我不想有可搜索的活动...
    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2016-03-24
    相关资源
    最近更新 更多