2012-08-24 58 views
0

我需要一个组件,允许用户输入一个值并通过连接到Internet上的某个站点来检查它是否存在,并在用户输入时显示建议。我想使用的搜索查看组件,但发现它有一定的局限性:Android SearchView组件的自定义

  1. 的开发人员能够创建处理搜索一个单独的活动。我不想使用其他活动,我只想连接到该网站并检查用户是否存在类型。

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

所以我的问题是:有没有使用与定制我的需要,还是我找难看的解决方法,通过该组件的要求遵守搜索查看组件的方式,还要做什么,我需要?

谢谢。

回答

0

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

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

+0

好吧,但如果我使用ListFragment,那么我将不必使用SearchView。我可以使用EditText和OnKeyListener来获得相同的效果。问题是,如果有一种方法可以挂钩到SearchView并使用其建议机制和UI,但是可以通过自定义的方式从我想要的任何源获取建议,而不一定是内容提供者。 – user940016

+0

只需制作您自己的ContentProvider即可返回您想要的数据(不一定是数据库)。 这或子类SearchView并重新编写适当的方法接受来自你想要的数据并适当地显示它(你可能需要看看源代码,看看它是如何完成的) – bennettaur

+0

好吧,但那么怎么样可搜索的活动?我不想使用它,但我必须定义它。我可以建立一个虚拟活动,但并不真正显示吗? – user940016

0

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

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

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

+0

我认为你不明白我的问题...我知道如何以标准方式使用搜索小部件,但我不希望有可搜索的活动... – user940016