Android EditText常用技能,包括clearFocus(),软键盘在界面开启关闭,点击关闭软键盘的问题

本篇文章将介绍Android中EditText的常用技能。

1.解决初次进入界面就弹出软件盘的问题:

首先产生该原因的根本原因是该EditText默认的获取了焦点了。

法1(不推荐): 

强制不让其弹出软件盘

 Mainfest.xml 设置属性 

        <activity android:name=".ui.activity.message.SessionActivity"
            android:windowSoftInputMode="stateHidden|adjustPan"></activity>

Activity中onCreate()设置

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Android避免进入页面EditText自动弹出软键盘
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }

该方法解决了不弹出软键盘,但是EditText 仍然获取了焦点了,效果是未弹出软键盘但光标仍然在闪

法2(推荐):

转移焦点,利用clearFocus()方法变相让其失去焦点,需要注意的是应当尽可能的转移到其父组件上

xml中,设置父组件可以获得焦点

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="97px"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:gravity="center_vertical"
            android:orientation="horizontal">

                <EditText
                    android:id="@+id/etContent"
                    android:layout_width="match_parent"
                    android:layout_height="80px"
                    android:background="@null"
                    android:drawableBottom="@drawable/selector_edit_focus"
                    android:visibility="visible"/>
        </LinearLayout>

在activity中:

清除该EditText的焦点即可。

    @Override
    protected void onResume() {
        super.onResume();
        mEtContent.clearFocus();
    }

该方法效果完美,而且易于实现。但是需要注意的是clearfocus之后就失去焦点了,也就不会响应点击事件,这个还是得权衡的

另外 view.requestFocus()是用户获取焦点的。mEditText.setCursorVisible(false)即设置光标不可见

当设置clearfocus()时,去点击编辑框,打印日志

        /*做一下测试*/
        mEtContent.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        Log.e("键盘", "ACTION_DOWN" );
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Log.e("键盘", "ACTION_MOVE" );
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.e("键盘", "ACTION_UP" );
                        break;
                }
                return false;
            }
        });

        mEtContent.setOnClickListener(view -> {
            Log.e("键盘", "OnClickListener" );
        });

clearFocus()点击事件Log结果:


requestFocus()点击事件Log结果


比较发现:无焦点不响应点击事件

2. 解决在弹出软件盘时立即退出该界面会出现界面错位的问题

我们可能会遇到当弹出软键盘时,用户突然点击了标题栏的返回按钮,这时候假若是退出到Fragment直接finish掉会出布局错落的问题。这时候需要先关闭再退出,而这时候的问题是可能是同步的,问题依旧还是会有,这时可以加个肉眼看不到的延迟。

            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            // 隐藏软键盘
            imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
            // 延迟个0.1秒是因为 可能推出太快导致软键盘刚刚被回收,前面的界面出现断层
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            finish();

嗯,很粗暴,但很管用啊。这里软键盘我直接关闭了也不太好,最好是可以判断下,但是貌似也没有特别好的api一定可以判断是弹出或者隐藏的,有时间做这个操作,直接关了岂不是更好呢。

3. 点击空白实现软键盘的隐藏

 public static void hideKeyboard(MotionEvent event, View view,
                                    Activity activity) {
        try {
            if (view != null && view instanceof EditText) {
                int[] location = { 0, 0 };
                view.getLocationInWindow(location);
                int left = location[0], top = location[1], right = left
                        + view.getWidth(), bootom = top + view.getHeight();
                // 判断焦点位置坐标是否在空间内,如果位置在控件外,则隐藏键盘
                if (event.getRawX() < left || event.getRawX() > right
                        || event.getY() < top || event.getRawY() > bootom) {
                    // 隐藏键盘
                    IBinder token = view.getWindowToken();
                    InputMethodManager inputMethodManager = (InputMethodManager) activity
                            .getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.hideSoftInputFromWindow(token,
                            InputMethodManager.HIDE_NOT_ALWAYS);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                View view = getCurrentFocus();
                UIUtils.hideKeyboard(ev,view,SessionActivity.this);
                break;
        }
        return super.dispatchTouchEvent(ev);
    }


猜你喜欢

转载自blog.csdn.net/crazyzhangxl/article/details/80189791