上图图1是默认的一种形式,当然你也可以自定义写一下提示弹框的布局效果, 看看下图图2:
Android 控件AutoCompleteTextView 自动提示输入内容(带提示的搜索框),类似EditText输入框的一种,其实源码中就是继承了EditText:
public class AutoCompleteTextView extends EditText implements Filter.FilterListener {...}
1.AutoCompleteTextView常用属性:
属性 | 描述 |
android:completionHint | 设置出现在下拉菜单底部的提示信息 |
android:completionThreshold | 设置触发补全提示信息的字符个数 |
android:dropDownHorizontalOffset | 设置下拉菜单于文本框之间的水平偏移量 |
android:dropDownHeight | 设置下拉菜单的高度 |
android:dropDownWidth | 设置下拉菜单的宽度 |
android:singleLine | 设置单行显示文本内容 |
android:dropDownVerticalOffset | 设置下拉菜单于文本框之间的垂直偏移量 |
- android:completionHint:设置下拉菜单中的提示标题
- android:completionHintView:定义提示视图中显示下拉菜单
- android:completionThreshold:指定用户至少输入多少个字符才会显示提示,注意默认是2,需要输入两个字符才可以提示
- android:dropDownAnchor:设置下拉菜单的定位"锚点"组件,如果没有指定改属性, 将使用该TextView作为定位"锚点"组件
- android:dropDownHeight:设置下拉菜单的高度
- android:dropDownWidth:设置下拉菜单的宽度
- android:dropDownHorizontalOffset:指定下拉菜单与文本之间的水平间距
- android:dropDownVerticalOffset:指定下拉菜单与文本之间的竖直间距
- android:dropDownSelector:设置下拉菜单点击效果
- android:popupBackground:设置下拉菜单的背景
使用ArrayAdapter来作为AutoCompleteTextView的数据适配器
2.布局:(一个最简单的案例)
<?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:orientation="horizontal">
<AutoCompleteTextView
android:layout_width="200dp"
android:layout_height="45dp"
android:text=""
android:padding="5dp"
android:background="@drawable/shape__blue_sgf"
android:layout_marginTop="30dp"
android:layout_marginLeft="30dp"
android:id="@+id/AutoCompleteTextView1"
android:completionThreshold="1"
android:completionHint="输入搜索内容"
android:layout_weight="7" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text="搜索"
android:layout_marginTop="30dp"
android:layout_marginRight="30dp"
android:layout_weight="1"
android:layout_marginLeft="10px"/>
</LinearLayout>
3.主函数:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.Toast;
/**
* AutoCompleteTextView
*/
public class AutoCompleteTextViewActivity extends AppCompatActivity {
private static final String[] capter=new String[]{
"明日科技","明日科技有限公司","明日编程词典","明日科技大厦","明日",
"明日之子","明日科技股份公司","明日编程大师在线辅导","明日科技飞船","明日之子视频"
};
private AutoCompleteTextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auto_c_tv);
textview=(AutoCompleteTextView)findViewById(R.id.AutoCompleteTextView1);
ArrayAdapter<String>adapter=new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,capter);
textview.setAdapter(adapter);
Button button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(AutoCompleteTextViewActivity.this,textview.getText().toString(),Toast.LENGTH_SHORT).show();
}
});
}
}
4.shape圆角背景:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--无圆角边框-->
<solid android:color="@android:color/white" />
<!--填充的颜色-->
<!--描边-->
<stroke
android:width="1dp"
android:color="@color/colorAccent" />
<!--设置外层边线的圆角度数-->
<corners android:radius="8dp"></corners>
</shape>
5.清单文件中添加属性,简单的解决AutoCompleteTextView与键盘的冲突:
<activity android:name=".AutoCompleteTextViewActivity" android:windowSoftInputMode="adjustPan|adjustResize"></activity>
上面代码为图1效果,需要图2效果的看下面:
1.布局代码:
<?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:orientation="horizontal">
<AutoCompleteTextView
android:layout_width="200dp"
android:layout_height="45dp"
android:text=""
android:background="@drawable/shape_blue_sgf"
android:layout_marginTop="30dp"
android:paddingLeft="15dp"
android:layout_marginLeft="30dp"
android:id="@+id/AutoCompleteTextView1"
android:completionThreshold="1"
android:dropDownHorizontalOffset="1dp"
android:dropDownVerticalOffset="10dp"
android:dropDownHeight="150dp"
android:layout_weight="7" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text="搜索"
android:layout_marginTop="30dp"
android:layout_marginRight="30dp"
android:layout_weight="1"
android:layout_marginLeft="10px"/>
</LinearLayout>
2.主函数执行代码:
textview.setThreshold(1);// 设置字符数为1,默认是2,当在控件里输入一个字符后,就可以自动提示了
//设置自定义的适配器
final AutoTextAdapater autoAadpter = new AutoTextAdapater(capter,
getApplicationContext());
textview.setAdapter(autoAadpter);
autoAadpter.setOnAddClickListener(new AutoTextAdapater.OnAddClickListener() {
@Override
public void onItemClick(int position, boolean add) {
Toast.makeText(AutoCompleteTextViewActivity.this, "删除了" + position, Toast.LENGTH_SHORT).show();
}
});
3.自己写适配器:AutoTextAdapater.java
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import android.content.Context;
import android.database.DataSetObservable;
import android.database.DataSetObserver;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;
import com.example.qd.douyinwu.R;
/**
* 用于自定义设置布局效果的适配器
*/
public class AutoTextAdapater implements ListAdapter, Filterable {
String[] strs;
Context conx;
MyFilter myFilter;
String tempKeyString;
//接口回调
public static interface OnAddClickListener {
// true add; false cancel
public void onItemClick(int position,boolean add); //传递boolean类型数据给activity
}
// add click callback
OnAddClickListener onItemAddClick;
public void setOnAddClickListener(OnAddClickListener onItemAddClick) {
this.onItemAddClick = onItemAddClick;
}
public AutoTextAdapater(String[] strs, Context conx) {
super();
this.strs = strs;
this.conx = conx;
}
@Override
public Filter getFilter() {
//自定义的拦截器,对包含的关键字进行处理
if (null == myFilter) {
myFilter = new MyFilter();
}
return myFilter;
}
@Override
public int getCount() {
return strs.length;
}
@Override
public Object getItem(int position) {
return strs[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
if(convertView==null){
view = View.inflate(conx, R.layout.item_info_dict, null);
holder = new ViewHolder();
holder.image = (ImageView) view.findViewById(R.id.image);
// holder.tv_input_code = (TextView) view.findViewById(R.id.tv_input_code);
holder.tv_item_name = (TextView) view.findViewById(R.id.tv_item_name);
view.setTag(holder);
}else{
view = convertView;
holder = (ViewHolder) view.getTag();
}
holder.image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(onItemAddClick != null) {
onItemAddClick.onItemClick(position,true);
}
}
});
// HashMap<String, String> pc = mList.get(position);
// String pc=mList.get(position);
// holder.tv_input_code.setText("code:"+pc.get("input_code"));
// holder.tv_item_name.setText("item_name:"+pc.get("item_name"));
holder.tv_item_name.setText(strs[position]);
// Log.i("---position---", "" + position);
// TextView tx = new TextView(conx);
// String temp1 = strs[position];
//使用网页来显示字体
// tx.setText(Html.fromHtml(""
// + tempKeyString + "" + " "
// + temp1.substring(tempKeyString.length(), temp1.length())));
return view;
}
class ViewHolder{
public ImageView image;
public TextView tv_item_name;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isEmpty() {
return true;
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
}
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int position) {
return true;
}
class MyFilter extends Filter {
String[] strsContains;
public MyFilter() {
super();
strsContains = strs;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Log.i(" constraint ", "constraint == " + constraint);
//filterREsults是filter的一个结果对象,里面只包括两个成员属性,Object 和 count
FilterResults result = new FilterResults();
//定义一个集合来保存数组中存在的关键字的字符串
ArrayList strsTemp = new ArrayList();
//在这里可以获取autoCompeted中输入的信息
//把字符串中包含这个关键字的item返回给adapter.
if (null != constraint && constraint.length() > 0) {
for (int i = 0; i < strsContains.length; i++) {
String tempstr = strsContains[i];
//同一做大小写的处理
if (tempstr.toLowerCase().contains(constraint.toString()
.toLowerCase()))//包含关键字的添加进去
{
strsTemp.add(tempstr);
}
}
result.values = strsTemp;
result.count = strsTemp.size();
}
//这个结果集 将会返回给 publishResults 方法中的 FilterResults results这个参数 所以我们在下面获取
return result;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
ArrayList tempList = (ArrayList) results.values;
if (null != tempList) {
String[] strsTemps = new String[tempList.size()];
for (int i = 0; i < tempList.size(); i++) {
strsTemps[i] = tempList.get(i).toString();
}
strs = strsTemps;
//这个时候输入的关键字
tempKeyString = constraint.toString();
}
}
}
}
4.适配器布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="@color/white"
android:layout_height="50dp"
android:layout_gravity="center"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_item_name"
android:layout_width="wrap_content"
android:singleLine="true"
android:layout_marginLeft="10dp"
android:layout_weight="1"
android:layout_height="30dp"
android:layout_gravity="center"
android:textSize="16sp"
android:text="item_name" />
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:gravity="center|right"
android:layout_marginRight="10dp"
android:layout_gravity="center"
android:src="@mipmap/ic_ac_unit_black"
android:layout_height="wrap_content" />
</LinearLayout>
5.蓝色背景效果:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--无圆角边框-->
<solid android:color="@android:color/white" />
<!--填充的颜色-->
<!--描边-->
<stroke
android:width="1dp"
android:color="#0000FF" />
<!--设置外层边线的圆角度数-->
<corners android:radius="8dp"></corners>
</shape>