#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. это даже не компилируется