Android中实现语句中的关键字变色

平时在网页中很容易看到有些搜索词变色,下面在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();
    }
}

结束!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时代新人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值