Xamarin Android EditText введите ключ
Я начал работать с Xamarin Studio несколько недель назад и не смог найти решение следующей проблемы:
создал edittext, который будет содержать серийные номера. Я хотел бы, чтобы ro запускала функцию после нажатия Enter.
Он работает нормально, когда я нажимаю Enter, функция работает без сбоев, но я не могу изменить содержимое edittext (я не могу ввести его).
Код:
EditText edittext_vonalkod = FindViewById<EditText>(Resource.Id.editText_vonalkod);
edittext_vonalkod.KeyPress += (object sender, View.KeyEventArgs e) =>
{
if ((e.Event.Action == KeyEventActions.Down) && (e.KeyCode == Keycode.Enter))
{
//Here is the function
}
};
Это код элемента управления:
<EditText
p1:layout_width="wrap_content"
p1:layout_height="wrap_content"
p1:layout_below="@+id/editText_dolgozo_neve"
p1:id="@+id/editText_vonalkod"
p1:layout_alignLeft="@+id/editText_dolgozo_neve"
p1:hint="Vonalkód"
p1:text="1032080293"
p1:layout_toLeftOf="@+id/editText_allapot" />
Я попытался использовать edittext_vonalkod.TextCanged
с его аргументами, проблема зарезервирована. Я могу изменить содержимое, но не могу обработать ключ Enter.
Спасибо!
Ответы
Ответ 1
Лучшим подходом было бы использовать событие EditorAction
, которое предназначено для запуска при нажатии клавиши Enter. Это будет такой код:
edittext_vonalkod.EditorAction += (sender, e) => {
if (e.ActionId == ImeAction.Done)
{
btnLogin.PerformClick();
}
else
{
e.Handled = false;
}
};
И чтобы иметь возможность изменить текст кнопки Enter, используйте imeOptions
в своем XML:
<EditText
p1:layout_width="wrap_content"
p1:layout_height="wrap_content"
p1:layout_below="@+id/editText_dolgozo_neve"
p1:id="@+id/editText_vonalkod"
p1:layout_alignLeft="@+id/editText_dolgozo_neve"
p1:hint="Vonalkód"
p1:text="1032080293"
p1:layout_toLeftOf="@+id/editText_allapot"
p1:imeOptions="actionSend" />
Ответ 2
Вам нужно отметить событие как не обрабатываемое, когда нажатой клавишей является ENTER. Поместите следующий код внутри обработчика KeyPress.
if (e.Event.Action == KeyEventActions.Down && e.KeyCode == Keycode.Enter)
{
// Code executed when the enter key is pressed down
}
else
{
e.Handled = false;
}
Ответ 3
попробуйте следующее:
editText = FindViewById(Resource.Id.editText);
editText.KeyPress += (object sender, View.KeyEventArgs e) =>
{
e.Handled = false;
if (e.Event.Action == KeyEventActions.Down && e.KeyCode == Keycode.Enter)
{
//your logic here
e.Handled = true;
}
};
Ответ 4
Еще лучше создать многоразовое расширение для EditText (EditTextExtensions.cs):
public static class EditTextExtensions
{
public static void SetKeyboardDoneActionToButton(this EditText editText, Button button)
{
editText.EditorAction += (sender, e) => {
if (e.ActionId == ImeAction.Done)
{
button.PerformClick();
}
else
{
e.Handled = false;
}
};
}
}