android EditText焦点问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android EditText焦点问题相关的知识,希望对你有一定的参考价值。

现有两个EditText
onCreate的时候初始化EditText
当EditText1为空时获取焦点,可输入
当EditText1有值(值为上次登录的记录)时不可输入 无焦点
即首次登录时焦点在EditText1 的位置,以后登录焦点在EditText2

请问怎么动态的获取和取消EditText1的焦点属性

根据你的描述,思路如下:
首先你要有数据存放,以便首次记录EditText1的数据后,再次登录能知晓EditText1已经有输入值,以此作判定是否给EditText1焦点。

数据操作有很多,无论是用数据库还是xml都行。
参考技术A 最简单的办法是在EditText前面放置一个看不到的LinearLayout,让他率先获取焦点:<LinearLayout        android:focusable="true" android:focusableInTouchMode="true"        android:layout_width="0px" android:layout_height="0px"/> 参考技术B android中,要使控件获得焦点,需要先setFocus,再requestFocus。
以Button为例:
btn.setFocusable(true);
btn.setFocusableInTouchMode(true);
然后获取焦点:
btn.requestFocus();
btn.requestFocusFromTouch();

Android中EditText焦点问题

https://www.jianshu.com/p/3d31d681f4bc

 

 

问题:当EditText失去焦点时做内容校验

场景:用户编辑EditText将内容清空,当点击空白地方时关闭软键盘,同时校验EditText的内容,如果为空则设为"1"。
问题远没有看着那么简单哦

第一步:添加焦点监听
view.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(!hasFocus){
                    Log.d("Tag","lose focus");
                    if(TextUtils.isEmpty(((EditText)v).getText().toString().trim())){
                        view.setText("1");
                    }
                }else {
                    Log.d("Tag","get focus");
                }
            }
        });
第二步:点击空白地方时关闭软键盘

在Activity中使用以下代码:

 @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if (isShouldHideInput(v, ev)) {

                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null) {
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
            return super.dispatchTouchEvent(ev);
        }
        // 必不可少,否则所有的组件都不会有TouchEvent了
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

    public boolean isShouldHideInput(View v, MotionEvent event) {
        if (v != null && (v instanceof EditText)) {
            int[] leftTop = {0, 0};
            //获取输入框当前的location位置
            v.getLocationInWindow(leftTop);
            int left = leftTop[0];
            int top = leftTop[1];
            int bottom = top + v.getHeight();
            int right = left + v.getWidth();
            if (event.getX() > left && event.getX() < right
                    && event.getY() > top && event.getY() < bottom) {
                // 点击的是输入框区域,保留点击EditText的事件
                return false;
            } else {
                //使EditText触发一次失去焦点事件
                v.setFocusable(false);
//                v.setFocusable(true); //这里不需要是因为下面一句代码会同时实现这个功能
                v.setFocusableInTouchMode(true);
                return true;
            }
        }
        return false;
    }

加入以上代码你惊喜的发现问题貌似完美的解决了。但是,如果你的界面中有多个EditText,你会发现当点击第一个EditText时,第二个EditText会有光标闪以下,或者点击第二个或者之后的EditText,第一个EditText会有光标闪一下。通过Log你会发现从第二次点击EditText起,每次点击EditText都会先触发一次失去焦点,再触发一次获取焦点。由此可以推断当存在多个EditText时,一个EditText失去焦点会触发另一个获取焦点。这问题必须解决,而且出现屏幕光标闪动影响用户体验。

第三步:避免另一个EditText获取焦点

解决这个问题的做法是在同一个XML中将一个不会有响应的控件(如TextView)设置如下属性:

android:focusable="true"
android:focusableInTouchMode="true"


作者:会飞的大象
链接:https://www.jianshu.com/p/3d31d681f4bc
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。






以上是关于android EditText焦点问题的主要内容,如果未能解决你的问题,请参考以下文章

安卓开发者进来一下,安卓悬浮窗口开发有问,悬浮的EditText为啥无法获得焦点.悬浮窗口不管我

android EditText焦点问题

Android EditText 自动获取焦点问题

Android中EditText焦点问题

Android - 问题解决之EditText自动获取焦点问题

安卓出现错误: java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.EditT