美文网首页
Android自定义搜索组件

Android自定义搜索组件

作者: dlihasa | 来源:发表于2021-09-23 14:10 被阅读0次

前言

本篇比较简单,只是一个搜索组件简单的封装

实现

Java代码如下:

package com.floruit.cxy.view.widget;

import android.app.Activity;
import android.content.Context;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;

import androidx.annotation.Nullable;

import com.floruit.cxy.R;

import static android.content.Context.INPUT_METHOD_SERVICE;

/**
 * 搜索组件
 */
public class SearchView extends LinearLayout {

    private String hint = "请输入关键词";
    private EditText et_input;
    private ImageView iv_del;

    private SearchChangeListener searchChangeListener;

    public SearchView(Context context) {
        super(context);
        initView(context,null);
    }

    public SearchView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView(context,attrs);
    }

    public SearchView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context,attrs);
    }

    public void setSearchListener(SearchChangeListener searchListener){
        this.searchChangeListener = searchListener;
    }

    public void setSearchText(String searchText){
        if(TextUtils.isEmpty(searchText)) return;
        et_input.setText(searchText);
        et_input.setSelection(searchText.length());
    }

    private void initView(Context context, AttributeSet attrs) {
        View view = LayoutInflater.from(context).inflate(R.layout.layout_search_view,this,true);
        et_input = view.findViewById(R.id.et_input);
        iv_del = view.findViewById(R.id.iv_del);
        setListener();
    }

    private void setListener() {
        et_input.setOnKeyListener(new View.OnKeyListener() {//点击搜索按钮监听事件
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                //是否是回车键
                if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                    //隐藏键盘
                    ((InputMethodManager) getContext().getSystemService(INPUT_METHOD_SERVICE))
                            .hideSoftInputFromWindow(((Activity)getContext()).getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                    et_input.clearFocus();
                    //搜索
                    if(searchChangeListener != null){
                        searchChangeListener.onSearchChanged(et_input.getText().toString().trim());
                    }
                }
                return false;
            }
        });

        et_input.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(searchChangeListener != null){
                    searchChangeListener.onTextChanged(s.toString().trim());
                }
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (!TextUtils.isEmpty(s.toString().trim())) {
                    iv_del.setVisibility(View.VISIBLE);
                } else {
                    iv_del.setVisibility(View.GONE);
                }
            }
        });

        iv_del.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                et_input.setText("");
            }
        });
    }

    public interface SearchChangeListener{

        void onSearchChanged(String keyWord);

        void onTextChanged(String keyWord);

    }

}

布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/ll_search"
    android:layout_width="match_parent"
    android:layout_height="31dp"
    android:layout_below="@+id/ll_simple_info"
    android:background="@drawable/white_search_bg"
    android:orientation="horizontal"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView
        android:layout_width="16dp"
        android:layout_height="16dp"
        android:layout_gravity="center_vertical"
        android:layout_marginStart="12dp"
        android:layout_marginEnd="4dp"
        android:src="@mipmap/search_icon"/>
    <EditText
        android:id="@+id/et_input"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="30dp"
        android:layout_marginEnd="15dp"
        android:layout_gravity="center_vertical"
        android:hint="请输入关键词"
        android:textColorHint="@color/search_hint"
        android:textSize="14sp"
        android:textColor="@color/black_2a"
        android:background="@color/white"
        android:gravity="start|center_vertical"
        android:imeOptions="actionSearch"
        android:singleLine="true"/>
    <ImageView
        android:id="@+id/iv_del"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:src="@mipmap/search_close"
        android:layout_marginEnd="@dimen/dp_10"
        android:visibility="gone"/>
</LinearLayout>

其实很多组件的封装并不复杂,就是一个封装的思想,让项目中使用起来方便,可复用,业务逻辑清晰,易维护。

当然也有很多酷炫难度较高的自定义控件,这个是需要很多技术技巧的,慢慢学习和积累也是可以做到的。

相关文章

  • Android自定义搜索组件

    前言 本篇比较简单,只是一个搜索组件简单的封装 实现 Java代码如下: 布局文件如下: 其实很多组件的封装并不复...

  • element UI cascader组件 filter-met

    在使用 elementUI cascader 组件搜索功能时, 组件默认是不支持大小写模糊搜索,需要通过自定义搜索...

  • 聊聊组件化开发

    如果你在京东图书频道搜索 组件化 或者 组件化开发,显示的几乎都是 Android组件化开发 或者 Android...

  • 2020-11-04

    自定义视图组件(自定义View)https://developer.android.google.cn/guide...

  • Android自定义模版View

    Android自定义模版View Android开发中有许多需要复用的组件,那么要如何才能自定义一个自定义的模版呢...

  • Android面试简录——组件2

    自定义组件 * Android怎么动态引用组件?动态引用:主程序和组件是分离的,组件可以单独升级和卸载。静态引用:...

  • 面试总结

    掌握Android四大组件,常用的布局文件,自定义控件等; Android四大基本组件分别是Activity,Se...

  • 小程序自定义组件

    一、自定义组件 1、什么是自定义组件? 小程序中常常会有一些通用的交互模块,比如“下拉选择列表”、“搜索框”、...

  • 25000字总结Android优秀的第三方框架、各种学习资料汇集

    前言 前几天总结了Android中常用到的系统组件、Design组件、自定义组件等等系列点击跳转地址:25000字...

  • 自定义AlertDialog对话框(1)-简单实现

    说明### 很多情况下,由于Android系统自带组件不够美观我们需要自定义自己的组件。实现自定义对话框有几种方法...

网友评论

      本文标题:Android自定义搜索组件

      本文链接:https://www.haomeiwen.com/subject/qjqogltx.html