安卓开发经常需要监听输入框的信息,进行自动搜索功能,在此记录实现的相关内容。

一、文本监听接口TextWatcher:

实现TextWatcher接口代码:

// 创建自己的TextWatcher监听类
private class MyTextWatcher implements 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) {

    }

    @Override
    public void afterTextChanged(Editable s) {
    }

}

接口中定义了三个方法:

/**
 CharSequence s:文本改变之前的内容
 int start:文本开始改变时的起点位置,从0开始计算
 int count:要被改变的文本字数,即将要被替代的选中文本字数
 int after:改变后添加的文本字数,即替代选中文本后的文本字数
 */
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
  • 该方法调用是在文本没有被改变,但将要被改变的时候调用.
/**
 CharSequence s:文本改变之后的内容
 int start:文本开始改变时的起点位置,从0开始计算
 int before:要被改变的文本字数,即已经被替代的选中文本字数
 int count:改变后添加的文本字数,即替代选中文本后的文本字数
 */
public void onTextChanged(CharSequence s, int start, int before, int count) {}
  • 该方法调用是在文本被改变时,改变的结果已经可以显示时调用
/**
  Editable s:改变后的最终文本
 */
public void afterTextChanged(Editable s) {}
  • 该方法是在执行完beforeTextChanged、onTextChanged两个方法后才会被调用

使用方法:

// 给EditText设置监听
mEdt.addTextChangedListener(new MyTextWatcher());

二、软键盘搜索键以及监听搜索键点击事件:

布局中定义一个EditText控件:

<EditText
    android:id="@+id/name_edit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_weight="1"
    android:background="@null"
    android:hint="请输入账户"
    android:textSize="14sp"
    android:ems="10"
    android:inputType="number"
    android:imeOptions="actionDone" /> 

<!-- 这里和onEditorAction中actionId对应-->

 调用 OnEditorActionListener监听:

/*
     * EditText是TextView子类
     * 方法:onEditorAction()
     * 第一个参数:TextView textView 表示当前触发事件的EditText的对象,类似于textView=findViewById(R.id.name_edit)
     * 第二个参数:int actionId 表示 按下“完成按钮”,这里和xml文件中EditText属性imeOptions对应,
     * 但要注意actionId是指软盘上的,而键盘上的actionId与软盘上的不一样;即在软盘上“完成按钮”的actionId为0,而键盘上的“完成按钮(回车键)”的actionId为6
     * 第三个参数:KeyEvent keyEvent 表示 按下“完成按钮”,这里和xml文件中EditText属性imeOptions对应,但keyEvent里面的内容更丰富,内容如下:
     * keyEvent.toString()=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_ENTER, scanCode=28, metaState=0, flags=0x8, repeatCount=0, eventTime=5664212, downTime=5664212, deviceId=1, source=0x301 }
     * 返回值:返回true,保留软键盘;false,隐藏软键盘
     */
    mEdt.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH){
                //TODO
                return true;
            }
            return false;
        }
    });

点击软件盘搜索,执行相应的代码。

注:当输入弹出软键盘的时候,下面的输入框会有一部分被软件盘挡住,从而不能获取焦点输入。

在androidMainfest.xml文件中在此Activity中写入:

android:windowSoftInputMode="adjustPan"