平时在网页中很容易看到有些搜索词变色,下面在Android中实现一下这个功能,也很简单,先来看下效果:
其中主要变色部分是下面这个封装的方法:
/**
* 实现语句中的关键词变色
* @param context 上下文
* @param name 语句
* @param key 关键字
* @return 得到关键字变色后的语句
*/
public static SpannableString setColor(Context context,String name,String key){
//key = "关键字";//关键词
//name = "我不是关键字,他才是关键字";//语句
SpannableString s = new SpannableString(name);
Pattern p = Pattern.compile(key);
Matcher m = p.matcher(s);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.text)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return s;
}
是不是很简单,下面我把整个demo内容写在下面:
1、页面主类ChangeKeywordsColorActivity
package com.example.test1.activity;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.test1.R;
import com.example.test1.color.ManagementListAdapter;
import com.example.test1.color.ManagementListBean;
import com.example.test1.utils.CommonTools;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by WJY.
* Date: 2021-05-27
* Time: 14:07
* Description: 实现语句中的关键词变色
*/
public class ChangeKeywordsColorActivity extends Activity {
private TextView tv_text;
private EditText et_search;//搜索框
private RecyclerView rv_managementList;//显示列表
private ManagementListAdapter managementListAdapter;
private List<ManagementListBean> planList = new ArrayList<>();//总的列表数据
private List<ManagementListBean> searchPlanList = new ArrayList<>();//搜索到的列表数据
private TextView tv_noEqp;//没有搜到相关内容
private String textStr = "这是一句话,里面所有的“关键字”要改变一下颜色,我就是关键字";
private String keyStr = "关键字";
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0:
managementListAdapter.setPlanList(ChangeKeywordsColorActivity.this,planList,"");
if (planList.size() == 0){
tv_noEqp.setVisibility(View.VISIBLE);
Toast.makeText(ChangeKeywordsColorActivity.this,"无数据",Toast.LENGTH_SHORT).show();
}else {
tv_noEqp.setVisibility(View.GONE);
rv_managementList.setVisibility(View.VISIBLE);
}
break;
}
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_keywords_color);
initView();
}
private void initView(){
tv_text = findViewById(R.id.tv_text);
SpannableString colorText = CommonTools.setColor(this,textStr,keyStr);
tv_text.setText(colorText);
tv_noEqp = findViewById(R.id.tv_noEqp);
et_search = findViewById(R.id.et_search);
rv_managementList = findViewById(R.id.rv_managementList);
setData();
rv_managementList.setLayoutManager(new LinearLayoutManager(ChangeKeywordsColorActivity.this));
managementListAdapter = new ManagementListAdapter(ChangeKeywordsColorActivity.this,planList,"");
rv_managementList.setAdapter(managementListAdapter);
//搜索框
et_search.addTextChangedListener(textWatcher);
}
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int before, int count) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String content = et_search.getText().toString().trim();
List<ManagementListBean> list = search(content);
if (content.isEmpty()){
handler.sendEmptyMessage(0);
}else {
if (list == null || list.size() <= 0) {
tv_noEqp.setVisibility(View.VISIBLE);
rv_managementList.setVisibility(View.GONE);
}else {
tv_noEqp.setVisibility(View.GONE);
rv_managementList.setVisibility(View.VISIBLE);
}
managementListAdapter.setPlanList(ChangeKeywordsColorActivity.this,searchPlanList,content);
}
}
@Override
public void afterTextChanged(Editable editable) {
}
};
public List<ManagementListBean> search(String name) {
searchPlanList.clear();
Pattern pattern = Pattern.compile(name);
for (int i = 0; i < planList.size(); i++) {
if (null != planList.get(i).getEquipmentName()) {
Matcher matcher = pattern.matcher(planList.get(i).getEquipmentName());
if (matcher.find()) {
searchPlanList.add(planList.get(i));
}
}
}
return searchPlanList;
}
private void setData(){
ManagementListBean managementListBean = new ManagementListBean();
managementListBean.setEquipmentName("我是测试内容1");
managementListBean.setSerialNumber("编号1");
managementListBean.setStartTime("2021.03.02 13:50");
ManagementListBean managementListBean2 = new ManagementListBean();
managementListBean2.setEquipmentName("我是测试内容2");
managementListBean2.setSerialNumber("编号2");
managementListBean2.setStartTime("2021.04.10");
ManagementListBean managementListBean3 = new ManagementListBean();
managementListBean3.setEquipmentName("我是测试内容3");
managementListBean3.setSerialNumber("编号3");
managementListBean3.setStartTime("2021.05.22");
planList.add(managementListBean);
planList.add(managementListBean2);
planList.add(managementListBean3);
}
}
2、页面布局activity_change_keywords_color,自己随便布局
<?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="vertical">
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dimen_16dp"
android:textColor="@color/black"
android:textSize="@dimen/dimen_14dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dimen_16dp"
android:textColor="@color/black"
android:textSize="@dimen/dimen_14dp"
android:text="下面是根据输入框输入的内容搜索列表,列表里只要有跟输入框内容一样的词就会变色"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/dimen_32dp"
android:layout_marginLeft="@dimen/dimen_16dp"
android:layout_marginRight="@dimen/dimen_16dp"
android:layout_marginTop="@dimen/dimen_10dp"
android:visibility="visible">
<EditText
android:id="@+id/et_search"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/dimen_4dp"
android:hint="输入搜索内容"
android:textColorHint="@color/color_text_balance_history"
android:textColor="@color/black"
android:textSize="@dimen/dimen_14dp"
android:background="@null"/>
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_managementList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dimen_16dp"
android:layout_marginRight="@dimen/dimen_16dp"
android:layout_marginTop="@dimen/dimen_10dp"
android:visibility="gone"/>
<TextView
android:id="@+id/tv_noEqp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="@dimen/dimen_16dp"
android:textColor="@color/color_text_balance_history"
android:text="没有搜到相关内容"
android:visibility="gone"/>
</LinearLayout>
3、其中用到的一个实体类ManagementListBean,我这里只是demo随便写的,自己根据实际情况写
package com.example.test1.color;
/**
* Created by WJY.
* Date: 2021/3/2
* Time: 13:40
* Description:
*/
public class ManagementListBean {
private String equipmentName;//设备名称
private String serialNumber;//设备位号
private String startTime;//申请维修日期
public String getEquipmentName() {
return equipmentName;
}
public void setEquipmentName(String equipmentName) {
this.equipmentName = equipmentName;
}
public String getSerialNumber() {
return serialNumber;
}
public void setSerialNumber(String serialNumber) {
this.serialNumber = serialNumber;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
}
4、适配器adapter
package com.example.test1.color;
import android.content.Context;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.example.test1.R;
import com.example.test1.utils.CommonTools;
import java.util.ArrayList;
import java.util.List;
/**
* Created by WJY.
* Date: 2020/11/2
* Time: 18:46
* Description: 列表
*/
public class ManagementListAdapter extends RecyclerView.Adapter<ManagementListAdapter.ManagementListHolder> {
private Context context;
private List<ManagementListBean> planList = new ArrayList<>();
private OnItemClickListener mOnItemClickListener;
private String keyStr;
public void setOnItemClickListener(OnItemClickListener onItemClickListener ){
this. mOnItemClickListener=onItemClickListener;
}
public ManagementListAdapter(Context context, List<ManagementListBean> planList,String keyStr){
this.context = context;
this.planList = planList;
this.keyStr = keyStr;
}
@Override
public ManagementListHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_management_list, parent, false);
return new ManagementListHolder(view);
}
@Override
public void onBindViewHolder(ManagementListHolder holder, final int position) {
//这里有几项需要变色的就写几个SpannableString
SpannableString colorText = CommonTools.setColor(context,planList.get(position).getEquipmentName(),keyStr);
holder.tv_eqpName.setText(colorText);
SpannableString colorText_num = CommonTools.setColor(context,planList.get(position).getSerialNumber(),keyStr);
holder.tv_num.setText(colorText_num);
holder.tv_applyTime.setText("日期:"+planList.get(position).getStartTime());
if( mOnItemClickListener!= null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOnItemClickListener.onClick(position);
}
});
}
}
@Override
public int getItemCount() {
return planList.size();
}
public class ManagementListHolder extends RecyclerView.ViewHolder {
private final TextView tv_eqpName;//名称
private final TextView tv_num;//编号
private final TextView tv_applyTime;//日期
public ManagementListHolder(View itemView) {
super(itemView);
tv_eqpName= itemView.findViewById(R.id.tv_eqpName);
tv_num = itemView.findViewById(R.id.tv_num);
tv_applyTime = itemView.findViewById(R.id.tv_applyTime);
}
}
public interface OnItemClickListener{
void onClick(int position);
}
public void setPlanList(Context context, List<ManagementListBean> planList,String keyStr){
this.context = context;
this.planList = planList;
this.keyStr = keyStr;
notifyDataSetChanged();
}
}
结束!!!