actionBar+SearchView实现搜索功能

在项目中有使用到ActionBar和SearchView,下面做一个总结以方便以后使用。

一、搜索控件:SearchView(SDK Version >=11)

SearchView的API:http://www.cnblogs.com/over140/archive/2011/05/13/2045334.html

(一)比较重要的方法和属性:

1、setIconifiedByDefault (boolean iconified):如果为true,UI一开始是一个放大镜,点击放大镜会一个editText和一个图标;如果为false,UI直接显示editText和一个图标。

2、SearchView.OnQueryTextListener:用于监听和处理 editText中文字发生改变或者点击了提交按钮的事件。

(二)搜索功能的实现

1、通过布局文件和SearchView.OnQueryTextListener

布局文件



    


MainActivity

getActionBar().setDisplayHomeAsUpEnabled(true);
		getActionBar().setDisplayShowTitleEnabled(false);
		getActionBar().setDisplayShowCustomEnabled(true);
		View view = getLayoutInflater().inflate(R.layout.custom_searchview,
				null);
		LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.WRAP_CONTENT);
		getActionBar().setCustomView(view, layoutParams);
		searchView=(SearchView)view.findViewById(R.id.sv_searchview);
searchView.setOnQueryTextListener(this);

2、searchable

步骤:

1)在res/xml/新建searchable.xml文件夹:



    

特别要注意的是:必须要使用如android:label="@string/searchable_label"这种方式赋值,直接在冒号里写值会导致SearchableInfo==null;

2)在菜单文件main.xml中加入

 

特别注意,android:actionViewClass="android.widget.SearchView"不要写错了,我就是将widget写错,导致获取不到SearchView

android:showAsAction="collapseActionView|ifRoom",其中collapseActionView是指折叠控件,ifRoom是指在屏幕有空间的情况下显示控件,showAsAction的其他值:

never-一直显示在更多(...)里

always-一直显示控件

withText-显示文字(默认只显示图标)


2)新建一个serarchable activity 

3)修改AndroidManifest.xml,新增如下代码:


            
                
            
            
        


4)MainActivity中的代码:

@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		
		super.onCreateOptionsMenu(menu);

		getMenuInflater().inflate(R.menu.main, menu);
		MenuItem searchItem=menu.findItem(R.id.action_search);
		SearchManager searchManager=(SearchManager)this.getSystemService(Context.SEARCH_SERVICE);
		
		SearchView searchView=(SearchView) searchItem.getActionView();
		if(searchView==null){
			showMsg("searchView is null");
			return true;
		}
		
		ComponentName cn=new ComponentName(this,SearchActivity.class);
		SearchableInfo info=searchManager.getSearchableInfo(cn);
		if(info==null){
			showMsg("cannot get the SearchableInfo");
		}
		searchView.setSearchableInfo(searchManager.getSearchableInfo(cn));
		
		searchQueryTextListener=new SearchQueryTextListener();
		searchView.setOnQueryTextListener(searchQueryTextListener);
		searchView.setIconifiedByDefault(false);
		return true;
	}

5)searchactivity中的代码

package com.dream.actionbardemo;

import android.app.Activity;
import android.app.SearchManager;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class SearchActivity extends Activity{
	
	private TextView tv;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_search);
		tv=(TextView)findViewById(R.id.tv_search_queryText);
		
		String action=getIntent().getAction();
		if(action.equals(Intent.ACTION_SEARCH)){
			String queryString=getIntent().getStringExtra(SearchManager.QUERY);
			tv.setText(tv.getText()+queryString);
		}
		
	}
}

具体代码见:http://download.csdn.net/detail/annieliu502/8062985

对于搜索,可以使用searchview,也可以使用自定义控件,自定义控件可以实现更多效果。可以通过actionBar.setCustomView(); 来将自定义控件显示在ActionBar中。


二、ActionBar

ActionBar 是android 3.0之后出现的带有导航功能的标题栏;

csdn上一位大牛有一篇非常详细的文章介绍:http://blog.csdn.net/xyz_lmn/article/details/8132420


我就简单记录下我在开发过程中遇到的问题希望以后不要再重复错误。

1、标题栏不出现的问题或者getActionBar为null:有些application的主题是不会显示标题栏的,所以要改一下主题,设置为,比如:

android:theme="@android:style/Theme.Holo" 

等能显示标题栏的主题


三、参考资料

Android UI开发第二十四篇——Action Bar: http://blog.csdn.net/xyz_lmn/article/details/8132420

Android UI开发详解之ActionBar:http://www.open-open.com/lib/view/open1373981182669.html






你可能感兴趣的:(Android)