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

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(“”);

}

/**

  • 获取输入的内容

*/

public String getText() {

return mInputKeyEt.getText().toString();

}

@Override

Android进阶资料

以下的资料是近年来,我和一些朋友面试收集整理了很多大厂的面试真题和资料,还有来自如阿里、小米、爱奇艺等一线大厂的大牛整理的架构进阶资料。希望可以帮助到大家。

Android进阶核心笔记

百万年薪必刷面试题

最全Android进阶学习视频

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
c void clearText() {

mInputKeyEt.setText(“”);

}

/**

  • 获取输入的内容

*/

public String getText() {

return mInputKeyEt.getText().toString();

}

@Override

Android进阶资料

以下的资料是近年来,我和一些朋友面试收集整理了很多大厂的面试真题和资料,还有来自如阿里、小米、爱奇艺等一线大厂的大牛整理的架构进阶资料。希望可以帮助到大家。

Android进阶核心笔记

[外链图片转存中…(img-J6Bz3DmV-1715142099500)]

百万年薪必刷面试题

[外链图片转存中…(img-R11cIzw6-1715142099502)]

最全Android进阶学习视频

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值