0

在“ In Android EditText how to get the cursor position in an OnTouchListener after it is set ”上发布的答案表明,将来可以安排一个线程为 100MS 给 Android 时间来更新 EditText 光标位置。没有提供如何实现这一点的代码。我已经尝试使用 Toast 来显示光标位置的以下测试代码。更新触摸后不显示光标位置。有人可以更正此代码,以便在 mText.setSelection(cursor) 中提供触摸位置吗?

OnTouchListener otl = new OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent evt) {
                    Runnable r = new Runnable()
                        {
                            public void run() 
                            {
                                int cursor = mText.getSelectionStart();
                                Toast.makeText(getApplicationContext(), "Cursor=" + cursor, Toast.LENGTH_SHORT).show();
                                mText.setSelection(cursor);
                            }
                        };
                        Handler handler = new Handler();
                        handler.postDelayed(r, 1500);
                        return true;
                    }
                 };
                mText.setOnTouchListener(otl);
4

1 回答 1

5

我放弃了安排未来的线程来给 Android 时间来更新光标位置。我找到了一种更好的方法来抑制软键盘,并且仍然可以在 EditText 框中显示闪烁的光标。我编写了一个 onTouchListener 并返回 true 以禁用键盘,而不是使用“mText.setInputType(InputType.TYPE_NULL)”。然后我必须从运动事件中获取触摸位置,以将光标设置到正确的位置。

这是我使用的代码:

  mText = (EditText) findViewById(R.id.editText1);
  OnTouchListener otl = new OnTouchListener() {
  @Override
  public boolean onTouch(View v, MotionEvent event) {
      switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
          Layout layout = ((EditText) v).getLayout();
          float x = event.getX() + mText.getScrollX();
          int offset = layout.getOffsetForHorizontal(0, x);
          if(offset>0)
              if(x>layout.getLineMax(0))
                  mText.setSelection(offset);     // touch was at end of text
              else
                  mText.setSelection(offset - 1);
          break;
          }
      return true;
      }
  };
  mText.setOnTouchListener(otl);
于 2013-01-06T18:00:38.580 回答