0

「 AndroidEditTextで、設定後にOnTouchListenerでカーソル位置を取得する方法」に投稿された回答は、スレッドを将来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 に答える