使用AutoCompleteTextView和SharePreference实现搜索历史自动提示功能

一、实现效果如下

图01


图02



二、相关代码

1.布局文件

activity_search_pop.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical" >

    <include layout="@layout/search" />

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >

        <FrameLayout
            android:id="@+id/search_pop_content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </FrameLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="5dp"
            android:background="@drawable/shape_cart"
            android:orientation="horizontal" >

            <ImageView
                android:id="@+id/search_pop_shopping_cart"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/shopping_cart" />

            <TextView
                android:id="@+id/search_pop_cart_number"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical" />
        </LinearLayout>
    </FrameLayout>

</LinearLayout>
search.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:background="@color/activity_search_title_bg"
    android:orientation="horizontal"
    android:paddingBottom="3dp"
    android:paddingLeft="3dp"
    android:paddingTop="3dp" >

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="0.0000001"
        android:focusable="true"
        android:focusableInTouchMode="true" >
    </LinearLayout>

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_vertical" >

        <AutoCompleteTextView
            android:id="@+id/main_auto"
            android:layout_width="fill_parent"
            android:layout_height="45dp"
            android:background="@drawable/search_edittext_selector"
            android:completionThreshold="1"
            android:dropDownHeight="wrap_content"
            android:dropDownHorizontalOffset="-6dp"
            android:dropDownVerticalOffset="-5dp"
            android:dropDownWidth="fill_parent"
            android:hint="@string/search"
            android:singleLine="true" />

        <ImageView
            android:id="@+id/ivDeleteText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerInParent="true"
            android:paddingRight="5dp"
            android:src="@drawable/xbtn"
            android:visibility="gone" />
    </RelativeLayout>

    <ImageView
        android:id="@+id/search_pop_search_image"
        android:layout_width="60dp"
        android:layout_height="45dp"
        android:layout_weight="0.00001"
        android:src="@drawable/ic_search_menu" />

</LinearLayout>
2.SearchActivityPop.java

package com.chinabuye.android.activity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnFocusChangeListener;
import android.view.View.OnKeyListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;
import android.widget.Toast;

import com.chinabuye.android.R;
import com.chinabuye.android.fragment.SearchFragment;
import com.chinabuye.android.slidingmenu.MyDrawerView;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;

public class SearchActivityPop extends FragmentActivity implements OnClickListener {
	private AutoCompleteTextView searchEdit;
	protected SlidingMenu side_drawer;
	//搜索按钮
	private ImageView searchBtn;
	private String str_search;
	private FragmentManager manager;
	//删除按钮
	private ImageView ivDeleteText;
	//购物车按钮
	private ImageView shoppingCart;
	private InputMethodManager imm;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_search_pop);
		manageActivity();
		initSlidingMenu();
		manager = getSupportFragmentManager();
		imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
		/***
		 * 初始化控件
		 */
		initView();
	}

	
	
	private void initView() {
	
		searchEdit = (AutoCompleteTextView) findViewById(R.id.main_auto);
		initAutoComplete("history", searchEdit);
		//文本内容变化监听,用于控制删除按钮的隐藏和显示
		searchEdit.addTextChangedListener(mTextChangeListener);
		//按键监听,用于监听手机键盘上的搜索按键
		searchEdit.setOnKeyListener(onKeyListener);
		searchEdit.setOnFocusChangeListener(mFocusChangeListenr);
		
		searchBtn = (ImageView) findViewById(R.id.search_pop_search_image);
		searchBtn.setOnClickListener(this);

		ivDeleteText = (ImageView) this.findViewById(R.id.ivDeleteText);
		ivDeleteText.setOnClickListener(this);

		shoppingCart = (ImageView) this.findViewById(R.id.search_pop_shopping_cart);
		shoppingCart.setOnClickListener(this);

		
	}

	@Override
	public void onClick(View view) {
		switch (view.getId()) {
		case R.id.search_pop_search_image:
			searchGoods();
			Toast.makeText(this, "点击了搜索按钮", 0).show();
			break;
		case R.id.ivDeleteText:
			searchEdit.setText("");
			break;
		case R.id.search_pop_shopping_cart:
			Intent intent = new Intent(SearchActivityPop.this, CartActivity.class);
			startActivity(intent);
			break;
		default:
			break;
		}

	}

	/**** 文本监听器 ******/
	private TextWatcher mTextChangeListener = new TextWatcher() {

		@Override
		public void onTextChanged(CharSequence s, int start, int before, int count) {
			
		}

		@Override
		public void beforeTextChanged(CharSequence s, int start, int count, int after) {

		}

		@Override
		public void afterTextChanged(Editable s) {
			/**
			 * 根据文本款的内容是否为空,隐藏和显示删除按钮
			 */
			if (s.length() == 0) {
				ivDeleteText.setVisibility(View.GONE);
			} else {
				ivDeleteText.setVisibility(View.VISIBLE);
			}
		}
	};

	/**** EditText按键监听 ****/
	private OnKeyListener onKeyListener = new OnKeyListener() {

		@Override
		public boolean onKey(View v, int keyCode, KeyEvent event) {
			/**
			 * 如果用户点击了手机键盘的enter键,响应搜索按钮的点击事件
			 */
			if (keyCode == KeyEvent.KEYCODE_ENTER) {
				searchBtn.performClick();
				return true;
			}
			return false;
		}
	};

	/**
	 * 焦点监听,文本框的焦点问题--手机键盘
	 */
	private OnFocusChangeListener mFocusChangeListenr = new OnFocusChangeListener() {

		@Override
		public void onFocusChange(View v, boolean hasFocus) {

			if (hasFocus) {
				imm.showSoftInputFromInputMethod(searchEdit.getWindowToken(), 0);
			} else {
				imm.hideSoftInputFromWindow(searchEdit.getWindowToken(), 0);
			}
		}
	};

	/**
	 * 搜索商品方法
	 */
	private void searchGoods() {
		saveHistory("history", searchEdit);

		str_search = searchEdit.getText().toString().trim();

		Toast.makeText(this, "str_search", 0).show();
		if (str_search != null && str_search.length() > 0) {
			changeToFragment(str_search);
		}
	}

	/**
	 * 产品界面
	 * 
	 * @param q
	 */
	private void changeToFragment(String q) {
		FragmentTransaction transaction = manager.beginTransaction();
		Fragment fragment = new SearchFragment();
		Bundle bundle = new Bundle();
		bundle.putString("q", q);
		fragment.setArguments(bundle);
		transaction.replace(R.id.search_pop_content_frame, fragment, "TAG" + q).commit();
	}

	/**
	 * 
	 * 把指定AutoCompleteTextView中内容保存到sharedPreference中指定的字符段
	 * 
	 * @param field
	 * 
	 *            保存在sharedPreference中的字段名
	 * 
	 * @param autoCompleteTextView
	 * 
	 *            要操作的AutoCompleteTextView
	 */
	private void saveHistory(String field, final AutoCompleteTextView searchEdit)
	{

		String text = searchEdit.getText().toString();

		SharedPreferences sp = getSharedPreferences("network_url", 0);

		String longhistory = sp.getString(field, "");

		if (!longhistory.contains(text + ","))
		{

			StringBuilder sb = new StringBuilder(longhistory);

			sb.insert(0, text + ",");

			sp.edit().putString("history", sb.toString()).commit();

		}

	}

	/**
	 * 
	 * 初始化AutoCompleteTextView,使 AutoCompleteTextView在一开始获得焦点时自动提示
	 * 
	 * @param field
	 * 
	 * 
	 *            保存在sharedPreference中的字段名
	 * 
	 * @param autoCompleteTextView
	 * 
	 *            要操作的AutoCompleteTextView
	 */

	private void initAutoComplete(String field, final AutoCompleteTextView searchEdit)
	{

		SharedPreferences sp = getSharedPreferences("network_url", 0);

		String longhistory = sp.getString("history", "no history");

		final String[] histories = longhistory.split(",");

		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.search_history, histories);

		if (histories.length > 20)
		{

			String[] newHistories = new String[20];

			System.arraycopy(histories, 0, newHistories, 0, 20);

			adapter = new ArrayAdapter<String>(this, R.layout.search_history, newHistories);

		}

		searchEdit.setAdapter(adapter);
		searchEdit.setOnFocusChangeListener(new OnFocusChangeListener()
		{

			@Override
			public void onFocusChange(View v, boolean hasFocus)
			{

				AutoCompleteTextView view = (AutoCompleteTextView) v;
				if (hasFocus)
				{
					view.showDropDown();
				}

			}

		});

	}
	private void manageActivity() {
		ActivityInstanceManager.getActivityInstanceManager().addActivity(this);
	}
	private void initSlidingMenu(){
		side_drawer = new MyDrawerView(this).initSlidingMenu();// 初始化侧边栏
	}
}

备注:以上是实现该功能的全部代码。

三、相关文章

这里的搜索历史自动提示功能,是通过AutoCompleteTextView自带的弹出窗口的形式完成的。如果要向实现多米音乐那样的搜索功能,即:

1)第一次切换到该页面,搜索框默认没有获取焦点,展示的fragment内容可以是推荐的内容

2)点击搜索框,搜索框获得焦点,展示的fragment内容是搜索历史记录,但是一开始历史记录肯定是空的,这时,可以进行判断,如果是空的,可以推荐一些关键词

3)点击搜索历史的某一栏,进行搜索,展示搜索结果。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值