Индекс позиции из MotionEvent в EditText

1

Учитывая EditText и его событие OnTouch, я переопределил его и вернул true. Это предотвратит показ программных клавиш. Но это также предотвращает внутренний расчет индекса положения внутри EditText. Это myEditText.getSelectionStart() всегда будет возвращать 0.

Есть ли способ, чтобы вычислить (или Android функция, которая может вычислить) индекс позиции на основе MotionEvent аргумента OnTouch события?

Благодарю.

  • 0
    Не могли бы вы описать более широко, чего вы пытаетесь достичь? У меня есть устройство с мягкой клавиатурой, поэтому я не могу ругаться, но я сомневаюсь, что на устройстве с жесткой клавиатурой появилось бы мягкое устройство - поэтому я полагаю, что вы пытаетесь запретить устройству с мягкой клавиатурой выдвигать его ... но какой смысл EditText, если пользователь не может набрать его? Может быть, другой виджет может быть более полезным? Следовательно, было бы хорошо, если бы вы дали более широкое представление о вашей идее. С уважением.
  • 0
    Привет, @pouzzler, я действительно хочу предотвратить показ мягкой программы и вместо этого показать мои собственные клавиши, которых очень мало, и состоит из определенных символов (около 12 конкретных клавиш). Я могу без проблем имитировать программные клавиши, за исключением положения курсора с сенсорным набором.
Теги:

3 ответа

0
Лучший ответ

После поиска SO и googling я понимаю, что решение не ясно. Поэтому я решил это, поставив под угрозу.

Я поставлю стрелки вправо/влево на моей клавиатуре, с помощью которой пользователь может перемещать курсор. Если пользователь нажимает текст редактирования, пока отображается моя клавиатура, он получит тост, говорящий ему использовать клавиатуру для того, что он пытается сделать.

1

В Android API сегодня есть решение getOffsetForPosition (float x, float y) с уровня API 14, чтобы получить положение символа, в котором было нажато на edittext. Это в основном метод, который вы можете вызвать изнутри одного из ваших слушателей для edittext (onClick или onTouch) следующим образом:

int click_position = <your_edittext>.getOffsetForPosition(event.getX(), event.getY());

где событие MotionEvent перешло в слушателя. Это дает положение символа на вид edittext, на котором было сделано касание, с помощью которого можно поместить курсор, используя

edittext.setSelection(click_position);

Но если вы хотите, чтобы это работало на устройстве, использующем версии Android раньше 4.0 (ICS) (уровень API 13 или меньше), этот API недоступен. Однако вы можете разработать свой собственный метод для версий API ниже 14, используя другие доступные API (что, по сути, было сделано Google с уровня API 14). я сделал это и смог успешно получить индекс позиции на edittext от motionevent. Я в основном скомпилировал статический метод с тем же именем, от других вызовов API, доступных в Android от уровня API 1. Я не уверен, что сейчас необходимо опубликовать код для более старых уровней API. Если есть интерес, я отправлю код здесь.

0

Я понимаю, что этот вопрос - год, но сейчас я пытаюсь сделать то же самое. Мое рассуждение заключается в том, что мне нужно хорошее решение для обработки локализованного ввода numberDecimal EditText, который Android не делает изначально: http://code.google.com/p/android/issues/detail?id=2626 и всех потоков на SO, пытаясь справиться с этой проблемой, не работают, когда производители, такие как Samsung, не принимают параметр "цифры".

Это не окончательный код для перевода события onTouch в поле в позицию курсора, но я только начал около получаса назад, поэтому здесь, где я нахожусь в своих R & D, для этого.

Он работает незначительно. Мне просто нужно выяснить, как вычислить параметр divisor для разных экранов. Значение 16 хорошо подходит для моего маленького старого телефона, но не для 7-дюймового планшета с более высокой плотностью.

[EDIT: хорошо работает на устройствах, на которых я тестировал. Слишком рано, чтобы сказать, справедливо ли это для других устройств.]

myField.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent me) {
            if (me.getAction() == MotionEvent.ACTION_DOWN) {
                try {
                    float dp = App.get().getResources().getDisplayMetrics().density;
                    int div = (int) (10 * dp);
                    int x = (int) me.getX();
                    int pos = (v.getWidth() - x) / div;
                    int strlen = ((EditText)v).getText().toString().length();
                    int curpos = strlen - pos;

                    v.requestFocus();

                    if (curpos < 0) {
                        ((EditText)v).setSelection(0);
                    } else {
                        ((EditText)v).setSelection(curpos);
                    }
                } catch (Exception e) {
                    Log.w(App.TAG, "onTouch exception " + e.toString());
                }
            }
            return true;
        }
    });
  • 0
    Вы можете использовать (int)((EditText)v).getPaint().measureText("0") чтобы определить длину символа, если View - EditText

Ещё вопросы

Сообщество Overcoder
Наверх
Меню