Android EditText实现关键词批量搜索示例
作者:shineflowers 发布时间:2022-12-09 06:20:21
标签:android,edittext
今天在项目中用到了用到了一种特殊的EditText,当用户在EditText中输入内容,点击搜索按钮的时候,输入的内容能够高亮,然后添加到输入的容器中。删除的时候,能够将容器中的关键词逐一删除。附上代码:
SearchEditText.java
package com.jackie.searchresultedittext;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
/**
* Created by Jackie on 2017/2/21.
* 用于搜索的EditText
*/
public class SearchEditText extends RelativeLayout {
private Context mContext;
private LayoutInflater mInflater;
private View mView;
private LinearLayout mContainer;
private EditText mEditText = null;
public SearchEditText(Context context) {
this(context, null);
}
public SearchEditText(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SearchEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private OnSearchChangeListener mSearchChangeListener;
public interface OnSearchChangeListener {
void searchChange(String s);
void removeView(int position);
}
public void setOnSearchChangeListener(OnSearchChangeListener searchChangeListener) {
mSearchChangeListener = searchChangeListener;
}
private void init(Context context) {
mContext = context;
mInflater = LayoutInflater.from(mContext);
mView = mInflater.inflate(R.layout.search_edittext_layout, null);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
params.leftMargin = 15;
params.rightMargin = 15;
addView(mView, params);
mContainer = (LinearLayout) mView.findViewById(R.id.layout);
mEditText = (EditText) mView.findViewById(R.id.edittext);
mEditText.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
if (isNotFastClick()) {
if (mEditText.getText().toString().length() > 0) {
String str = mEditText.getText().toString();
str = str.substring(0, str.length() - 1);
mEditText.setText(str);
mEditText.setSelection(str.length());
} else {
if (mContainer.getChildCount() > 0) {
if (mSearchChangeListener != null) {
mSearchChangeListener.removeView(mContainer.getChildCount() - 1);
}
mContainer.removeViewAt(mContainer.getChildCount() - 1);
}
}
}
}
return true;
}
});
mEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
if (mEditText.getText().toString().trim().equals("")) {
return true;
}
TextView textView = new TextView(mContext);
textView.setText(mEditText.getText().toString().trim());
textView.setTextSize(14);
textView.setTextColor(Color.parseColor("#dfe0e0"));
textView.setPadding(10, 0, 10, 0);
textView.setBackgroundResource(R.drawable.shape_edittext_round_bg);
textView.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.leftMargin = 10;
textView.setLayoutParams(params);
if (mSearchChangeListener != null) {
mSearchChangeListener.searchChange(mEditText.getText().toString().trim());
}
mEditText.setText("");
mContainer.addView(textView);
}
return true;
}
});
}
public EditText getEditText() {
return mEditText;
}
public LinearLayout getContainer() {
return mContainer;
}
long lastClickTime = 0;
public boolean isNotFastClick() {
long time = System.currentTimeMillis();
if (time - lastClickTime >= 300) {
lastClickTime = time;
return true;
} else {
return false;
}
}
}
search_edittext_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
android:fillViewport="true"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="33dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_gravity="center_vertical" />
<EditText
android:gravity="center_vertical"
android:layout_gravity="center_vertical"
android:id="@+id/edittext"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@null"
android:textSize="16dp"
android:textColor="#dfe0e0"
android:layout_weight="1"
android:minWidth="50dp"
android:imeOptions="actionSearch"
android:singleLine="true"
android:layout_marginLeft="10dp"/>
</LinearLayout>
</HorizontalScrollView>
shape_edittext_round_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#666666" />
<corners android:radius="10dp"/>
</shape>
来源:http://blog.csdn.net/shineflowers/article/details/58058010?locationNum=8&fps=1


猜你喜欢
- 目录1、如果一个方法或变量是"private"访问级别,那么它的访问范围是:2、代码将打印?3、下面关于hibernat
- 本文实例为大家分享了android序列化过程Parcelable的具体代码,供大家参考,具体内容如下直接上代码:注释都写的很清楚了。publ
- SpringBoot项目中新增脱敏功能项目背景目前正在开发一个SpringBoot项目,此项目有Web端和微信小程序端。web端提供给工作人
- 简介由于最近的项目需求,需要在把配置类导入到容器中,通过查询,使用@Import注解就能实现这个功能,@Import注解能够帮我们吧普通配置
- 前言前两篇我们详细了解了 findById 和 findAll 以及 findAll 的分页查询,如果说JPA只有上面的两种查询功能,那就太
- 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划简要介绍了Android系统进程间通
- 问题遇到问题:在前后端分离跨域访问的项目中shiro进行权限拦截失效 (即使有正确权限的访问也会被拦截) 时造成302重定向错误等问题报错:
- 单例模式有一下特点:1、单例类只能有一个实例。2、单例类必须自己自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。单例模式确
- sql中like通配符模糊匹配问题针对oracle数据库:将查询条件通过功能类处理/** * Desc
- 一.关于使用Mybatisplus自带的selectById和insert方法时的一些问题1.selectById的问题(1).表的主键列名
- init_output_stream() 是一个公共的函数,无论是音频,还是视频的输出流的初始化,都是通过它来完成的。init_o
- 本文实例为大家分享了android使用OPENGL ES绘制圆柱体的具体代码,供大家参考,具体内容如下效果图:编写jiem.java&nbs
- 好久就想着好好搭建一个ssm框架,自己以后用也方便吧,但是最近的事真的是很多,很多事情都没有去干,有时候自己会怀疑一下人生自己该不该去做程序
- 应用场景有些时候项目中会用到很多路径,并且很可能多个路径在同一个根目录下,那为了方便配置的修改,达到只修改根目录即可达到一改全改的效果,此时
- 本文实例为大家分享了java实现饮料自助售货机的具体代码,供大家参考,具体内容如下①用户类import java.util.Scanner;
- 前言底部Tab已经是一个应用的标配了,因为手机屏幕大小的限制,使得我们必须去最大化的利用可见的空间。当然底部Tab一般为3个左右,最多不会超
- finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常
- 前言:理论和代码必须结合起来才能真正的掌握一、this概念:this代表着当前对象的引用,也是当前函数所属对象的引用。直白的说,哪个对象调用
- HashMap的get()方法的NullPointerException今天写代码发现一个 bug,HashMap的 get() 方法一直报
- IntelliJ IDEA是很多程序员必备且在业界被公认为最好的Java开发工具,有很多小伙伴在安装完IDEA并且tomcat之后,启动to