Android AutoCompleteTextView 自动提示输入内容

上图图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>

 

相关链接:(多了解一下EditText字符串过滤器InputFilter和Filter )

运用 Filter 实现关键字搜索,并且高亮显示关键字

https://github.com/xiaxiayige/TestSearchView

https://github.com/Yalantis/SearchFilter

https://github.com/Wrdlbrnft/Searchable-RecyclerView-Demo

https://github.com/rajasharan/SearchableSpinner

 

https://github.com/klinker41/android-chips

https://github.com/greenhalolabs/EmailAutoCompleteTextView

https://github.com/andyxialm/KMPAutoCompleteTextView   自动补全TextView,支持搜索字符高亮显示等

https://github.com/FrederickRider/AutoCompleteBubbleText

https://github.com/whieenz/SearchSelect   利用Dialog自定义可搜索筛选的Android选择控件

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值