0

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

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

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

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

谢谢。

4

2 回答 2

0

这很简单。您只需使用 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);
}
}

于 2012-08-24T16:05:30.407 回答
0

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

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

于 2012-08-24T16:07:32.963 回答