欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-19 23:18:10
...

本篇文章将介绍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结果:

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

requestFocus()点击事件Log结果

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

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

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);
    }