安卓开发基础——EditText的使用与对其延伸的探究

744 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

前言

2月13日

今天在工作开发中又提到了在WebView中输入框唤起软键盘时,遮挡住输入框的问题,本来想在网上搜索看看有什么成熟的解决方法,但一时半会也没找到,于是还是复习一下基础知识,正好我们安卓也有自己原生的输入框控件EditText,今天就来看看如何使用它吧。

2月14日

今天已经解决了WebView输入框被遮挡的问题,顺便记录在本文中。

正篇

EditView基本使用方法

作为基础控件,我们首先需要先将其放入布局文件中:

image.png

<EditText
    android:id="@+id/vEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/please_write_here"
    android:maxLines="2"/>

我们可以使用android:hint属性去指定提示文本,这个提示文本会在我们输入任何内容时消失,除此以外,我们再用android:maxLines属性确定输入后最多显示成几行文本。

当然,我们EditText控件还有许多其他属性可用:

image.png

接下来我们看看在Activity中我们对EditText的使用,其中我们要用到对输入框的输入内容的监听需要addTextChangedListener()方法:

binding.vEditText.addTextChangedListener(watcher)

但我们可以看到,这个方法里我们传入了watcher参数,这个参数是TextWatcher的实现对象,我们在这个对象内部调用三个方法实现对输入内容的具体监听:

private val watcher: TextWatcher = object : TextWatcher {
    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        TODO("Not yet implemented")
    }

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        TODO("Not yet implemented")
    }

    override fun afterTextChanged(s: Editable?) {
        TODO("Not yet implemented")
    }
}

源码: image.png

翻译: image.png 从上图可知,我们在其他两个方法中只能对s监听,只能在afterTextChanged中才能修改s,但也要注意不能写成死循环(除非需要,比如限制一些输入方式不能输入)。

此外,我们还对输入框判断其获得或失去焦点的方法:

binding.vEditText.setOnFocusChangeListener { v, hasFocus ->
    if (v.id == binding.vEditText.id) {
        Log.d("hasFocus = ", hasFocus.toString())
    }
}

hasFocus参数是boolean值,可以判断是否获得焦点。

此外,我们还可以通过在XML布局的android:imeOptions属性把唤起软键盘的回车样式改成其他的:

image.png

android:imeOptions="actionSearch"

actionSearch这种一般会让回车变成“搜索”或者一个放大镜样式,actionDone一般会变成“完成”,而actionSend会变成“发送”。

此外,我们可以发送关闭输入的命令让我们在一些需要收起软键盘的情形下满足需求“

val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager

imm.hideSoftInputFromWindow(window.decorView.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

WebView中的尴尬局面

以上内容是作为安卓原生控件的操作,我们可以通过对控件本身的属性和方法进行控制以满足我们的各种需求,但现在的APP很多情况下页面中放的是Web页,通过WebView去展示的,这时候,如果前端开发人员在网页上加了编辑框,我们是比较难控制的,而且发展出了一系列至今官方未给出解决方案的问题,下面我们提一下这方面的问题与对应比较好的解决方法。

首先,通常情况下,我们对编辑框点击后,编辑框获取焦点,然后就会唤起软键盘,方便我们进行输入操作,而唤起软键盘对应的布局变化我们是可以进行控制的:

正常情形下,我们设置以下参数就能让布局被软键盘顶起,以达到防止遮挡输入框的效果:

window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)

而WebView中设置上面的会失效,所以我们可以换成:

window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)

但是上面这个参数已经被废弃,调用的新方式我看着好像还有适配问题:

image.png

所以经过搜索发现网上讨论的最多的就是issue 5497问题(Google Issue Tracker

解决方法:Android How to adjust layout in Full Screen Mode when softkeyboard is visible - Stack Overflow 将这个类放入项目中,后在Activity的onCreate()调用即可:

image.png 最终解决了我的问题,但看解决日期很老了,不知道现在是不是有更好的方法去替代。

总结

本篇主要是讲述EditText的基础使用方法,可以通过这些方法我们去完成一些简单的输入框构建操作,然后以此为基础,我们就能学习到一些控件的通用性质,以及一些延伸的知识。