Intereting Posts
Векторная графика в Android Как сохранить мой BroadcastReceiver Как конвертировать DP, PX, SP между собой, особенно DP и SP? Получите время выполнения видео, воспроизводимого при видеообъявлении? Android-колонка «_id» не существует? Определение общедоступного устройства ip При использовании clipToPadding в ListView элементы перерабатываются преждевременно Android Studio 2.3 не имеет спецификатора Test Instrumentation в интерфейсе пользователя Не удается найти устройство Android с помощью команды «adb devices» Firebase + Разрешения Фрагмент без просмотра сбоев при изменении конфигурации Добавление цветного фона с текстом / значком под развернутой строкой при использовании Android RecyclerView Флажки MultiSelectListPreference не проверяются, если они не отображаются в списке (API 23) Ошибка памяти при загрузке большего количества изображений в Glide Android как использовать строковый ресурс в классе java

Android: как получить текстовое положение из сенсорного события

Я хочу реализовать пользовательский текстовый интерфейс с сенсорным + перетаскиванием текста, а клавиатура не поднимается, в отличие от поведения по умолчанию с длинным щелчком, поднимая меню CCP и клавиатуру. Мое понимание предполагает, что мне нужен такой подход:

onTouchEvent(event){ case touch_down: get START text position case drag get END text position set selection range from START to END } 

Я узнал все о getSelectStart () и различных методах установки диапазона и т. Д., Но я не могу найти, как получить текстовую позицию на основе события touch getX () и getY (). Есть какой-либо способ сделать это? Я видел поведение, которое я хочу в других офисных приложениях.

Кроме того, как я могу остановить клавиатуру, пока она не будет запрошена вручную?

Solutions Collecting From Web of "Android: как получить текстовое положение из сенсорного события"

«MText.setInputType (InputType.TYPE_NULL)» будет подавлять мягкую клавиатуру, но также отключает мигающий курсор в окне EditText под Android 3.0 и выше. Я закодировал onTouchListener и вернул true, чтобы отключить клавиатуру, а затем должен был получить позицию касания от события движения, чтобы установить курсор в нужное место. Вы можете использовать это в событии движения ACTION_MOVE, чтобы выбрать текст для перетаскивания.

Вот код, который я использовал:

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

Спасибо Waine Kail за обмен стартовым кодом, но он обрабатывает только ось «x». Для многострочного EditText вы также должны:

1- Рассчитать вертикальное положение (y):
2- Получить смещение линии по вертикали
3- Получить смещение текста, используя линию и горизонтальное положение

 EditText et = (EditText) findViewById(R.id.editText1); long offset = -1; //text position will be corrected when touching. et.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP: Layout layout = ((EditText) v).getLayout(); float x = event.getX() + et.getScrollX(); float y = event.getY() + et.getScrollY(); int line = layout.getLineForVertical((int) y); // Here is what you wanted: offset = layout.getOffsetForHorizontal( line, x); break; } return false; } }); 

Я тоже сталкиваюсь с той же проблемой. И когда я попытался использовать «int offset = layout.getOffsetForHorizontal (0, x);» Как сказал Уэйн Кайл , также получил NPE в этой линии. Поэтому я попытался и, в конце концов, написал вот так:

 mText = (EditText) findViewById(R.id.editText1); OnTouchListener otl = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { EditText editText = (EditText) v; float x = event.getX(); float y = event.getY(); int touchPosition = editText.getOffsetForPosition(x, y); if (touchPosition>0){ editText.setSelection(touchPosition); } return true; } }; mText.setOnTouchListener(otl); 

Для моего приложения мне нужно было получить позицию в сенсорном списке, но вышеприведенное решение, похоже, не дает точного местоположения. Для меня это чаще всего было отключено на 1-2 символа относительно текстового курсора. Приведенный ниже код решает это. Ключ, чтобы заставить это работать, – использовать post (), чтобы отложить код до тех пор, пока позиция курсора не будет обновлена. Таким образом, позиция, которую я получаю, гарантированно согласуется с позицией EditText, а код также проще.

 setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_UP) { //At this point the selection has not been updated. So post an //event at the end of the event queue to check where cursor //has been moved post(new Runnable() { public void run() { Editable sb=getText(); int currentPos=getSelectionStart(); //TODO } }); } return false; } });