EditText 集锦 - 开发中常用的用法及遇到的各种坑,Android开发避坑指南

本文介绍了如何在Android应用中控制EditText获取焦点的逻辑,包括设置软键盘可见,以及如何监听输入法按键、输入内容长度和限制输入字符。此外,还讨论了如何使用过滤器限制输入内容,如禁止表情和中文输入。最后提到了面试学习资源的分享,包括大厂面试真题和全套学习资料。
摘要由CSDN通过智能技术生成

editText.setFocusable(true);

editText.setFocusableInTouchMode(true);

editText.requestFocus();

//显示软键盘

activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

//如果上面的代码没有弹出软键盘 可以使用下面另一种方式

//InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

// imm.showSoftInput(editText, 0);

}

取消 EditText 默认获取焦点的行为

在EditText的父级控件中找一个,添加这两个属性:

android:focusable=“true”

android:focusableInTouchMode=“true”

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:focusable=“true”

android:focusableInTouchMode=“true”

<EditText

android:id=“@+id/search_edittext”

android:layout_width=“fill_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“15dp”

android:background=“@drawable/search_bar_edit_bg”

android:drawableLeft=“@drawable/search_bar_icon_normal”

android:hint=“搜索”

android:selectAllOnFocus=“true”

android:singleLine=“true”

监听输入法中的回车按钮

比如, QQ, 讯飞,搜狗输入法下面有个回车按钮,有时候我们按下按钮,希望立即提交内容。这时候,可以通过监听输入法按下的 key 来实现

mEt.setOnKeyListener(new View.OnKeyListener() {

@Override

public boolean onKey(View v, int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {

Log.i(TAG, “手指弹起时执行确认功能”);

return true;

}

return false;

}

});


限制输入框的输入内容


监听 EditText 的输入状态

  • 像新浪微博一样,提醒还可以输入多少字

  • 限制最多可以输入多少字

这些都可以通过监听 EditText TextChangedListener 实现

mInputEditTxt.addTextChangedListener(new 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) {

Log.i(TAG, “监听EditText输入内容的变化,在这里可以监听输入内容的长度。”);

}

@Override

public void afterTextChanged(Editable s) {

Log.i(TAG, “这里可以实现所输即所得,用户输入的同时可以立即在这里根据输入内容执行操作,显示搜索结果!”);

}

});

限制输入多少字符

在开发当中,我们通常需要对 text 的输入字符进行限制输入,比如限制输入 30 个字符,虽然我们可以直接调用 setMaxLength

方法来限制输入,但是这样会有一个问题,就是当你的 text 超过 30 个字符的时候,你调用 mEtText.setText ,这时候会报错。因此,最好,还是采用如下的方法, addTextChangedListener 监听文本变化,在字符串变化的时候对文本长度进行截取,

public static final int MAX_LEN = 30;

if (!TextUtils.isEmpty(mValue)) {

int len = Math.min(mValue.length(), MAX_LEN);

mValue = mValue.substring(0, len);

mEtText.setText(mValue);

mEtText.setSelection(mValue.length());

}

mEtText.addTextChangedListener(new 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) {

Editable text = mEtText.getText();

if (TextUtils.isEmpty(text)) {

return;

}

if (text.length() > MAX_LEN) {

mEtText.setText(text.subSequence(0, MAX_LEN));

mEtText.setSelection(mEtText.getText().length());

}

}

@Override

public void afterTextChanged(Editable s) {

}

});

限制输入内容

有时候,输入框中,我们想限制输入内容,比如禁止输入表情,禁止输入中文等,这时候,可以使用 editText.setFilters(filters) 的方法。下面,列举了一些常用的限制。

public class InputTxtFilter{

public static final int INPUT_TYPE_EN = 0x01;

public static final int INPUT_TYPE_CH = 0x02;

private static final String[] SPELL = new String[]{

“a”,“b”,“c”,“d”,“e”,“f”,“g”,“h”,“i”,“j”,“k”,“l”,“m”,“n”,“o”,“p”,“q”,“r”,“s”,“t”,“u”,“v”,“w”,“x”,“y”,“z”,

“ā”,“á”,“ǎ”,“à”,“ō”,“ó”,“ǒ”,“ò”,“ē”,“é”,“ě”,“è”,“ī”,“í”,“ǐ”,“ì”,“ū”,“ú”,“ǔ”,“ù”,“ǖ”,“ǘ”,“ǚ”,“ǜ”,“ü”

};

private static char[] chineseParam = new char[]{‘」’,‘,’,‘。’,‘?’,‘…’,‘:’,‘~’,‘【’,‘#’,‘、’,‘%’,‘*’,‘&’,‘$’,‘(’,‘‘’,‘’’,‘“’,‘”’,‘『’,‘〔’,‘{’,‘【’

,‘¥’,‘£’,‘‖’,‘〖’,‘《’,‘「’,‘》’,‘〗’,‘】’,‘}’,‘〕’,‘』’,‘”’,‘)’,‘!’,‘;’,‘—’};

private InputTxtFilter( ){

}

public static void inputFilter( final Context context, final EditText editText, final int type, final int inputLimit){

InputFilter[] filters = new InputFilter[1];

filters[0] = new InputFilter.LengthFilter(inputLimit){

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend){

boolean isRightCharater = false;

if(type == INPUT_TYPE_EN){

isRightCharater = isLetter(source.toString());

}else if(type == INPUT_TYPE_CH){

isRightCharater = isChineseWord(source.toString());

}

if ( !isRightCharater|| dest.toString( ).length( )>=inputLimit ){

return “”;

}

return source;

}

};

editText.setFilters(filters);

}

/**

  • 检测String是否全是中文

*/

public static boolean isChineseWord( String name ){

boolean res=true;

char[] cTemp = name.toCharArray( );

for( int i = 0; i < name.length( ); i++ ){

if( !isChinese( cTemp[ i ] ) ){

res=false;

break;

}

}

return res;

}

/**

  • 是否为英文字母

  • */

public static boolean isLetter( String inputStr ){

char[] inputArray = inputStr.toCharArray( );

List spellList = Arrays.asList( SPELL );

for( char input : inputArray ){

if( !spellList.contains( input + “” ) ){

return false;

}

}

return true;

}

/**

  • 判定输入汉字

  • @param c

*/

public static boolean isChinese( char c ){

for( char param : chineseParam ){

if( param == c ){

return false;

}

}

Character.UnicodeBlock ub = Character.UnicodeBlock.of( c );

if ( ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS

|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS

|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A

|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION

|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION

|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS ){

return true;

}

return false;

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结:

面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。

有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。

附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结:

面试是一个不断学习、不断自我提升的过程,有机会还是出去面面,至少能想到查漏补缺效果,而且有些知识点,可能你自以为知道,但让你说,并不一定能说得很好。

有些东西有压力才有动力,而学到的知识点,都是钱(因为技术人员大部分情况是根据你的能力来定级、来发薪水的),技多不压身。

附上我的面试各大专题整理: 面试指南,满满的都是干货,希望对大家有帮助!
[外链图片转存中…(img-ruLGUQWD-1712486581976)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值