设为首页 加入收藏

TOP

为你的 Android 应用增加本地搜索功能(一)
2015-02-25 16:15:14 来源: 作者: 【 】 浏览:88
Tags:Android 应用 增加 本地 搜索 功能

搜索是各种应用程序的一个基本功能需求. 在我们的案例中,我们拥有一个餐厅的应用程序,需要它能让用户可以方便和快速的搜索菜品清单,找到他们想要的东西. 在本文中,我将会描述我在对UI进行持续的维护时先我们现有的餐厅应用程序加入本地搜索功能过程. 我会详细讲述我选择的UI方案及其理由, 此外还涉及到像activity中加入一个GestureOverlayView.



图 1: 餐厅应用程序的搜索视图截图


搜索


对于搜索这个功能,在我们开始编写代码之前还需要做诸多设计上面的考虑. 你想要搜索的都是些什么东西? 我们想要为用户对标题和描述一并进行搜索,以获得做大的结果集,而这是因为标题并不总是会告知这份菜品实际是什么样子的. 此外你还可以增加一些针对每个菜品的隐藏元数据的搜索. 而对于搜索activity的布局,你像让搜索结果集如何显示出来呢? 一开始我是用一个列表视图来展示结果集,就像购物车视图的activity. 然后,这样的话菜品看上去就并不会吸引人来在上面点击,因为图片很小,而当我让图片变得更大的时候,页面上能够一屏展示的结果集就少了. 因此我决定把菜品清单的主题部分显示方案锁定在了网格视图上, 但不去在一侧显示一个更大的详细视图,而是会让网格视图占据屏幕的整个显示空间,使其能很容易的不同于一般的菜品清单. 现在为了查询单项的详细视图,用户要用手机单击一项,然后它就会以一个浮动在界面之上的对话式的fragment显示出来?(见图 2). 那样用户就可以快速的在其它地方单击以关闭这一项,然后在另外一项上面单击查看另外的这一项. 搜索运行起来需要快速而且流畅,对于用户而言,他们想要尽可能快的找到他们想要的信息,否则他们可能不会找到某一项,而沮丧的离开. 最后的问题是我们准备如何处理用户隐私? 我们可以设计一个能基于近期搜索行为提供搜索建议的搜索功能,或者是一个需要输入用户私人信息的搜索功能. 这可能会带来有关其他人可能会看到你要搜索的是什么,以及你的私人信息会流向哪里,这样的担忧. 不过在我们的案例中,因为只是是一个餐厅的应用程序,所以你大可不必因为人们会知道你喜欢吃什么派而担忧,而又写应用程序是需要你慎重考虑一下用户隐私的. 对于我们的应用程序,不需要任何私人的信息, 也不会将任何的搜索项记录日志,而且没有搜索项的历史记录.


/**
* Builds a table of items matching the searchTerm in their name or description
*/
? ? public Cursor searchMenuItems(String searchTerm) {
? ? ? ? SQLiteDatabase db = getReadableDatabase();
? ? ? ? SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
? ? ? ? qb.setTables(TABLES.MENU);
? ? ? ? Cursor c = qb.query(db, null, "("+MenuColumns.NAME+" LIKE '%"+searchTerm+"%') " +
? ? ? ? ? ? "OR ("+MenuColumns.DESCRIPTION+" LIKE '%" + searchTerm+"%')",
? ? ? ? ? ? null, null, null, null);
? ? ? ? return c;
? ? }


代码示例 1: 查询数据库的方法


接下来,我们需要在主activity的操作栏中设置上搜索选项. 更多有关设置操作栏的信息可以阅读这篇文章:?为 Android 设备构建动态UI. 搜索功能的处理将完全在我们的应用程序里面; 我们并不想要在搜索一开始的时候列出已经安装在设备上的应用程序清单,或者发送一个intent来让另外一个搜索应用程序来进行处理.


向 MainActivity 类添加如下这个字符串变量. 我们会使用这个变量来向搜索的intent发送所要查询的字符串:


/* Search string label */
? ? public final static String SEARCH_MESSAGE= "com.example.restaurant.MESSAGE";


代码示例 2: 向搜索intent中添加扩展数据的类变量


更新 MainActivity 的 onCreateOptionsMenu 方法:


/**
? ? * Initialize the action menu on action bar
? ? */
? ? public boolean onCreateOptionsMenu(Menu menu) {
? ? ? ? getMenuInflater().inflate(R.menu.action_bar, menu);
?
? ? ? ? //set up the search
? ? ? ? MenuItem searchItem = menu.findItem(R.id.action_search);
? ? ? ? SearchView mSearchView = (SearchView) searchItem.getActionView();
? ? ? ? searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM
? ? ? ? ? ? ? ? | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
? ? ? ? //set up the query listener
? ? ? ? mSearchView.setOnQueryTextListener(new OnQueryTextListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean onQueryTextSubmit(String query) {
? ? ? ? ? ? ? //start the search intent
? ? ? ? ? ? ? Intent searchIntent = new Intent(MainActivity.this, SearchResultsActivity.class);
? ? ? ? ? ? ? searchIntent.putExtra(SEARCH_MESSAGE, query);
? ? ? ? ? ? ? ? startActivity(searchIntent);
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean onQueryTextChange(String query) {
? ? ? ? ? ? ? ? //do nothing in our case
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? });
? ? ? ?
? ? ? ? return super.onCreateOptionsMenu(menu);
? ? }


代码示例 3: 操作栏初始化代码


以及 SearchResultsActivity 类:


public class SearchResultsActivity extends Activity{
?
? TextView mQueryText;
? GridView searchListResults;
? SearchAdapter adapter;
? Vector searchList;
?
? @Override
? public void onCreate(Bundle savedInstanceState) {
? ? super.onCreate(savedInstanceS

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++11的auto和decltype关键字 下一篇Android仿UC浏览器左右上下滚动功..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: