所以我有一个有输入和其他布局的视图。我想要做的是在用户在输入中键入内容并单击输入要输入的输入中的文本后,他可以再次输入。
视图看起来像这样。
<CC.AlwaysFocusEditText
android:id="@+id/infoArticleEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:textSize="16dp"
android:textColor="@android:color/black"
android:fontFamily="sans-serif"
android:singleLine="true"
android:theme="@style/ExtendProTheme"
android:cursorVisible="true"
android:selectAllOnFocus="true"
android:maxLength="30"
local:MvxBind="EnterCommand SearchArticleCommand;Text ArticleCode, Mode=TwoWay; Error Errors['ArticleCode']" />
AlwaysFocusEditText是来自EditText的扩展控件,因此它可以执行EnterCommand
public class AlwaysFocusEditText : EditText
{
public AlwaysFocusEditText(Context c, IAttributeSet a) : base(c, a)
{
this.KeyPress += OnEnterKeyPressed;
}
public AlwaysFocusEditText(Context context, IAttributeSet attrs, int defStyle) :
base(context, attrs, defStyle)
{
this.KeyPress += OnEnterKeyPressed;
}
public ICommand EnterCommand { get; set; }
protected void OnEnterKeyPressed(object sender, View.KeyEventArgs e)
{
if (EnterCommand != null)
{
if (e.KeyCode == Android.Views.Keycode.Enter && e.Event.Action == KeyEventActions.Up)
{
EnterCommand.Execute(null);
InputMethodManager imm = (InputMethodManager)Context.GetSystemService(Context.InputMethodService);
imm.HideSoftInputFromWindow(this.WindowToken, 0);
e.Handled = false;
var input = (EditText)sender;
input.SetSelection(0, input.Text.Length);
}
else
{
e.Handled = false;
}
}
}
}
看起来像这样。
我试过了 1。 var input =(EditText)sender; input.SetSelection(0,input.Text.Length); 2。 var input =(EditText)sender; input.SelectAll(); 3。 var input =(EditText)sender; input.RequestFocus(); input.SelectAll();
如果我让它失去焦点并重新获得它(通过点击)它可以工作,但这不是我想要的。我认为它必须是一个非常简单的方法,即在选择输入中的所选文本之后。
有人可以向我解释我错过了什么。我不是那么老的机器人。我缺少一些东西。
E:
if (e.KeyCode == Android.Views.Keycode.Enter && e.Event.Action == KeyEventActions.Up)
{
input.SelectAll();
e.Handled = false;
}
这就像一个魅力,但是调用我的EnterCommand使得该字段松散了所有选择。我不明白为什么。
编辑:
public IMvxCommand SearchArticleCommand => new MvxCommand(async () => await DoThreadAction(SearchArticle));
private async Task SearchArticle()
{
if (IsValid())
{
Article = await _articleService.GetArticleDetails(_articleCode, CurrentAdministration.Id);
}
}
protected override bool IsValid()
{
var validator = new ValidationHelper();
ArticleCode = ScanHelper.ExtractArticleCode(_articleCode);
validator.AddRequiredRule(() => ArticleCode, Messages.ArticleCodeRequired);
var result = validator.ValidateAll();
Errors = result.AsObservableDictionary();
return result.IsValid;
}