一、实现效果如下
图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)点击搜索历史的某一栏,进行搜索,展示搜索结果。