У меня есть EditText
который выложен в Framelayout
. Я пытаюсь разрешить EditText
перемещаться по экрану при выборе.
Следовательно, всякий раз, когда пользователь выбирает режим, который позволяет перемещать элементы, я устанавливаю текст редактирования включенным (false), это работает, удаляя возможность редактирования текста для получения фокуса и отображения мигающего курсора или экранной клавиатуры. Но в то же время я не могу получить сенсорный ввод, когда я пытаюсь его переместить.
Есть ли какие-либо решения, из которых я смогу переместить текст редактирования и не иметь текст редактирования для получения фокуса?
Я попробовал настроить focusable
или focusableInTouchMode
на false, но он тоже не работает.
Я сделал это двумя настройками. Сначала вам нужно, чтобы ваша структура обертки (LinearLayout) обрабатывала события перемещения. Прикрепите это к вашей обертке. Событие Touch:
void FrameTouch (object sender, View.TouchEventArgs e)
{
if (e.Event.Action == MotionEventActions.Move) {
int placeX = (int)e.Event.GetX () - v.Width / 2;
int placeY = (int)e.Event.GetY () - v.Height / 2;
v.Layout (placeX, placeY, placeX+v.Width, placeY+v.Height);
}
}
Затем вам необходимо переопределить событие EditText onTouch, чтобы убедиться, что он не проглатывает события касания, когда он отключен:
public override bool OnTouchEvent (MotionEvent e)
{
if (!Enabled)
return false;
base.OnTouchEvent (e);
return true;
}
Я думаю, что использование FrameLayout может быть неправильным выбором:
Все дочерние элементы FrameLayout закреплены в верхнем левом углу экрана; вы не можете указать другое местоположение для дочернего представления. (из документов)
Попробуйте обернуть EditText в его собственный макет (например, LinearLayout), чтобы вы могли реагировать на события касания от макета вместо EditText.
setFocusableInTouchMode()
чтобы отключить фокус для вашего EditText, таким образом LinearLayout должен вместо этого взять фокус.