美文网首页
Android EditText 和软键盘常见用法

Android EditText 和软键盘常见用法

作者: yoomaz | 来源:发表于2018-10-22 15:47 被阅读19次

    EditText 和软键盘常见用法

    前因

    产品有这样一个需求,一个输入框,刚开始进入页面的时候不获取焦点,第一次点击输入框光标到最后,后面再点击定位到具体文字,键盘收起来输入框失去焦点。

    分析与实现

    其实即使把 EditText 的使用方式组合起来,再监听一下软键盘的抬起,其中的一些小细节还是需要考虑的。

    • 功能一:EditText 刚进入见面的时候不获取焦点,不自动弹出键盘

      解决:在父布局 加上下面两个属性,获取焦点即可:

      android:focusable="true"
      android:focusableInTouchMode="true"
      
    • 功能二:第一次点击后光标到最后,再点击定位到具体文字

      这个稍微麻烦一点,首先关闭 EditText 的焦点:

      android:focusable="false"
      

      然后监听 EditText的点击事件:

      etLeaveWords.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      if (!etLeaveWords.hasFocus()) {
                          etLeaveWords.setFocusable(true);
                          etLeaveWords.setFocusableInTouchMode(true);
                          etLeaveWords.requestFocus();
                          KeyboardUtil.softShow(mContext, etLeaveWords);
                          String message = etLeaveWords.getText().toString();
                          if (!TextUtils.isEmpty(message)) {
                              etLeaveWords.setSelection(message.length());
                          }
                      }
                  }
              });
      

      注意这几部是一个整体,因为 requestFocus() 后用户需要再点击一次才可以显示键盘,这里我们直接强行显示出来:

      etLeaveWords.setFocusable(true);
      etLeaveWords.setFocusableInTouchMode(true);
      etLeaveWords.requestFocus();
      KeyboardUtil.softShow(mContext, etLeaveWords); // 显示键盘
      

      至于定位,直接调用 setSelection() 方法

      至于软件盘消失,EditText 失去焦点,用的网上的一个方案:

      etLeaveWords.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                  @Override
                  public void onGlobalLayout() {
                      Rect r = new Rect();
                      etLeaveWords.getWindowVisibleDisplayFrame(r);
      
                      int heightDiff = etLeaveWords.getRootView().getHeight() - (r.bottom - r.top);
                      if (heightDiff < 200) {
                        // 处理键盘隐藏
                          etLeaveWords.setFocusable(false);
                      }
                  }
              });
      

    相关文章

      网友评论

          本文标题:Android EditText 和软键盘常见用法

          本文链接:https://www.haomeiwen.com/subject/jqygzftx.html