自定义控件 带删除按钮的EditText

android:id=“@+id/et_input_search_key”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:layout_gravity=“center_vertical”

android:layout_marginEnd=“@dimen/dimen_35”

android:background=“@null”

android:drawablePadding=“@dimen/dimen_5”

android:drawableStart=“@drawable/icon_address_search_img_test”

android:ellipsize=“end”

android:gravity=“center_vertical”

android:hint=“关键字/位置/品牌/酒店名”

android:imeOptions=“actionSearch”

android:inputType=“text”

android:maxLines=“1”

android:paddingStart=“@dimen/dimen_10”

android:textColor=“@color/color_1e1e1e”

android:textColorHint=“@color/color_949494”

android:textCursorDrawable=“@null”

android:textSize=“@dimen/font_size_14”/>

<ImageView

android:id=“@+id/iv_input_search_key_del”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_gravity=“center_vertical|end”

android:layout_marginEnd=“@dimen/dimen_10”

android:layout_marginStart=“@dimen/dimen_10”

android:scaleType=“centerCrop”

android:src=“@drawable/icon_delete_img_test”

android:visibility=“gone”/>

里面有一些颜色啊,shape啊什么的,暂时就不拿出来了,比较多,那些也不影响大局.

创建自定义EditTextWithDelete控件,继承FrameLayout


将布局加载进来,初始化

LayoutInflater.from(getContext()).inflate(R.layout.hotel_layout_edittext_with_del, this,

true);

mInputKeyEt = findViewById(R.id.et_input_search_key);

mDeleteIv = findViewById(R.id.iv_input_search_key_del);

添加点击事件


//删除按钮点击事件

mDeleteIv.setOnClickListener(this);

//用户输入的内容变化事件

mInputKeyEt.addTextChangedListener(this);

//监听软键盘按下回车事件

mInputKeyEt.setOnEditorActionListener(this);

//EditText焦点变化事件

mInputKeyEt.setOnFocusChangeListener(this);

对监听事件处理


//删除按钮点击事件

@Override

public void onClick(View v) {

int viewId = v.getId();

if (viewId == R.id.iv_input_search_key_del) {

//删除按钮

mInputKeyEt.setText(“”);

}

}

//输入内容变化之后

@Override

public void afterTextChanged(Editable s) {

String inputText = mInputKeyEt.getText().toString();

if (inputText.length() > 0) {

mDeleteIv.setVisibility(VISIBLE);

} else {

mDeleteIv.setVisibility(GONE);

}

mOnFocusEnterListener.onTextChange(mInputKeyEt.getText().toString());

}

//用户按下回车键

@Override

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

//当actionId == XX_SEND 或者 XX_DONE时都触发

//或者event.getKeyCode == ENTER 且 event.getAction == ACTION_DOWN时也触发

//注意,这是一定要判断event != null。因为在某些输入法上会返回null。

if (actionId == EditorInfo.IME_ACTION_SEND

|| actionId == EditorInfo.IME_ACTION_DONE

|| (event != null && KeyEvent.KEYCODE_ENTER == event.getKeyCode() && KeyEvent

.ACTION_DOWN == event.getAction())) {

//处理事件 回调用户按下enter键时EditText上已输入的值

if (mOnFocusEnterListener != null) {

mOnFocusEnterListener.onEnterClick(mInputKeyEt.getText().toString());

}

return true;

}

return false;

}

定义控件内容的一些事件可供外部监听


外部可能会对该控件的一些状态,事件比较感兴趣,可以监听一下,得到数据和状态.

/**

  • 设置监听器 用于监听控件的一些事件

  • @param onEditTextListener 监听器

*/

public void setOnEditTextListener(OnEditTextListener onEditTextListener) {

this.mOnEditTextListener = onEditTextListener;

}

/**

  • 监听用户按下enter键,监听EditText获取焦点

*/

public interface OnEditTextListener {

/**

  • 回调用户按下enter键时EditText上已输入的值

  • @param key EditText上已输入的值

*/

void onEnterClick(String key);

/**

  • EditText焦点发生变化

  • @param view 焦点发生变化的view

  • @param hasFocus true:有焦点 false:无焦点

*/

void onTopBarFocusChange(View view, boolean hasFocus);

/**

  • 输入的文字发生改变

  • @param textContent 输入的内容

*/

void onTextChange(String textContent);

}

提供一些其他方法给外部


/**

  • 清除焦点

*/

public void clearFocus() {

mInputKeyEt.clearFocus();

}

/**

  • 设置文本内容

*/

public void setText(String text) {

mInputKeyEt.setText(text);

}

/**

  • 清空输入的值

*/

public void clearText() {

mInputKeyEt.setText(“”);

}

完整代码


import android.content.Context;

import android.support.annotation.Nullable;

import android.text.Editable;

import android.text.TextWatcher;

import android.util.AttributeSet;

import android.view.KeyEvent;

import android.view.LayoutInflater;

import android.view.View;

import android.view.inputmethod.EditorInfo;

import android.widget.EditText;

import android.widget.FrameLayout;

import android.widget.ImageView;

import android.widget.TextView;

/**

  • Created by feiyang on 2017/12/4 12:31

  • Description : 带删除按钮的自定义布局(FrameLayout)

*/

public class EditTextWithDelete extends FrameLayout implements View.OnClickListener, TextWatcher,

TextView.OnEditorActionListener, View.OnFocusChangeListener {

private EditText mInputKeyEt;

private ImageView mDeleteIv;

private OnEditTextListener mOnEditTextListener;

public EditTextWithDelete(Context context) {

this(context, null);

}

public EditTextWithDelete(Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

public EditTextWithDelete(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

initView();

}

private void initView() {

LayoutInflater.from(getContext()).inflate(R.layout.hotel_layout_edittext_with_del, this,

true);

mInputKeyEt = findViewById(R.id.et_input_search_key);

mDeleteIv = findViewById(R.id.iv_input_search_key_del);

mDeleteIv.setOnClickListener(this);

mInputKeyEt.addTextChangedListener(this);

mInputKeyEt.setOnEditorActionListener(this);

mInputKeyEt.setOnFocusChangeListener(this);

}

@Override

public void onClick(View v) {

int viewId = v.getId();

if (viewId == R.id.iv_input_search_key_del) {

//删除按钮

mInputKeyEt.setText(“”);

}

}

/**

  • 设置文本内容

*/

public void setText(String text) {

mInputKeyEt.setText(text);

}

/**

  • 清空输入的值

*/

public void clearText() {

mInputKeyEt.setText(“”);

}

尾声

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

  • 思维脑图
  • 性能优化学习笔记


  • 性能优化视频

    当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
    《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
    分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

  • 思维脑图
    [外链图片转存中…(img-gpEWkbaw-1715364447567)]

  • 性能优化学习笔记
    [外链图片转存中…(img-vO3kyLCr-1715364447568)]
    [外链图片转存中…(img-hDU2Z8dY-1715364447569)]

[外链图片转存中…(img-tpVcAUxt-1715364447569)]
[外链图片转存中…(img-36G1FbFY-1715364447570)]

  • 性能优化视频
    [外链图片转存中…(img-zRPSQ9XI-1715364447570)]
    当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
    《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值