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学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!