EditText, OnTouchListener и setSelection не работают при первом касании

#java #android #user-interface #android-edittext

#java #Android #пользовательский интерфейс #android-edittext

Вопрос:

У меня есть следующий код, который срабатывает каждый раз, когда затрагивается мой «redTime» EditText.

 redTime.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.i("click", "onMtouch");
            redTime.setSelection(redTime.getText().length());
            return false;
        }
    });
 

Он предназначен для удержания курсора в правой части EditText при каждом касании. Проблема в том, что строка, содержащая метод «setSelection», не работает при ПЕРВОМ касании элемента управления. То есть, если другой элемент управления имеет фокус, и я впервые касаюсь элемента управления «redTime», метод запускается, но курсор остается в том месте, к которому я прикоснулся (не с правой стороны).

Как я узнаю, что слушатель срабатывает? Вызов «Log.i» работает, но не изменение курсора. Я подозреваю, что вызов «setSelection» работает, но какое-то более позднее событие его отменяет.

Я попробовал несколько вещей. Я попытался использовать событие, вернув TRUE в прослушивателе. Не сработало. Я попытался повторить вызов «setSelection» в OnTouchListener, а также OnFocusChanged. По-прежнему не работает.

Чуть не забыл. Вот XML для рассматриваемого элемента управления.

 <EditText
            android:id="@ id/redEditText"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:ellipsize="end"
            android:gravity="right"
            android:inputType="time"
            android:text="@string/zeroTime"
            android:textColor="#ff0000"
            android:textSize="32sp" >
        </EditText>
 

Комментарии:

1. Куда вы добавляете OnTouchListener?

2. @Code-Apprentice Я добавляю его в метод onCreate.

Ответ №1:

Недавно я столкнулся с этой проблемой и ничего не смог заставить работать, поэтому в итоге сделал это:

     setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    setSelection(getText().length());
                }
            }, 50);
            return false;
        }
    });
 

Комментарии:

1. Похоже, что это какая-то ошибка с EditText, потому что у меня был тип decimal, он работал нормально, но затем изменился на number и перестал нормально устанавливать селектор

2. это единственное решение, которое сработало для меня, только вместо postDelayed я использовал hander.postDelayed, а обработчик — android.os.Handler

Ответ №2:

Чтобы избежать ошибки, сделайте что-то вроде этого:

 yourEditText.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                yourEditText.setFocusable(true);
                yourEditText.requestFocus();
                yourEditText.setSelection(emailEditText.getText().length());
                break;
            case MotionEvent.ACTION_UP:
                v.performClick();
                break;
            default:
                break;
            }
            return true;

        }
    });
 

Ответ №3:

Вы могли бы сделать

 redTime.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.i("click", "onMtouch");
        redTime.setFocusable(true);
        redTime.requestFocus();
        redTime.setSelection(redTime.getText().length());
        return false;
    }
});
 

Перед вызовом setSelection этот способ redTime будет иметь фокус при выполнении выбора.

Комментарии:

1. Спасибо, что перезвонили мне! Но я не уверен, куда бы я это поместил. Пожалуйста, что вы имели в виду для этого кода?

2. @mcsilvio Вот так!

3. После попытки это, похоже, не работает. Тем не менее, спасибо.

Ответ №4:

Просто поместите edittext, как показано ниже

    <EditText    
    android:id="@ id/from"
    android:focusable="false" 
    android:hint="@string/pickup_location"
    android:imeOptions="actionNext"  
    android:inputType="textNoSuggestions"    
    android:padding="10dp"
    android:textColor="@android:color/white" />
 

Установите прослушиватель ontouch в своей активности

  EditText et = (EditText)findViewById(R.id.et); et.setOnTouchListener(this)



@Override   public boolean onTouch(View v, MotionEvent event) {     
if (event.getAction() == MotionEvent.ACTION_UP)     
    switch (v.getId()) {            
            case R.id.from:
                //do your action
                break;
 

Ответ №5:

используйте этот метод:

 redTime.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction()==MotionEvent.ACTION_UP){  //check the event
                 redTime.requestFocus();  //keep focus on the EditText(redTime)
                 redTime.selectAll();  //select all text
            }

        }
        return true;
});
 

Комментарии:

1. это даже не компилируется