如何解决始终保持Android键盘上的焦点到下一个条目
我有20个条目,这些条目是通过循环动态创建的。在textchange上,我将焦点放在下一个条目上,将焦点放在下一个条目上,然后键盘又隐藏又显示,这在每次文本更改时都会发生。我希望键盘在textchange后每次显示前都不会一直隐藏,直到最后20个条目..
----我的自定义条目
public class MyEntry : Entry
{
public static readonly BindableProperty IsFocusProperty = BindableProperty.Create("IsFocus",typeof(bool),typeof(MyEntry),false,propertyChanged: OnChanged);
static void OnChanged(BindableObject bindable,object oldValue,object newValue)
{
var entry = bindable as MyEntry;
var focus = (bool)newValue;
if (focus)
{
entry.Focus();
}
else
{
entry.Unfocus();
}
}
public bool IsFocus
{
get { return (bool)GetValue(IsFocusProperty); }
set
{
SetValue(IsFocusProperty,value);
}
}
public MyEntry()
{
this.Focused += MyEntry_Focused;
this.Unfocused += MyEntry_Unfocused;
}
private void MyEntry_Unfocused(object sender,FocusEventArgs e)
{
this.IsFocus = false;
}
private void MyEntry_Focused(object sender,FocusEventArgs e)
{
this.IsFocus = true;
}
}
-我的模特
public class CrossingUIModel : BaseViewModel
{
public int Id { get; set; }
private string fieldValue;
public string FieldValue
{
get { return fieldValue; }
set
{
if (fieldValue != value)
{
fieldValue = value;
OnPropertyChanged(nameof(FieldValue));
}
}
}
private bool isFocus = false;
public bool IsFocus
{
get { return isFocus; }
set
{
if (isFocus != value)
{
isFocus = value;
OnPropertyChanged(nameof(IsFocus));
}
}
}
}
-我的视图模型
public void CreateUI()
{
UserDialogs.Instance.ShowLoading();
BindCrossingUIModel = new ObservableCollection<CrossingUIModel>();
for (int i = 1; i < 21; i++)
{
CrossingUIModel model = new CrossingUIModel();
model.Id = i;
BindCrossingUIModel.Add(model);
}
foreach (CrossingUIModel model in BindCrossingUIModel)
{
model.PropertyChanged += Model_PropertyChanged;
}
UserDialogs.Instance.HideLoading();
}
private void Model_PropertyChanged(object sender,PropertyChangedEventArgs e)
{
if (e.PropertyName == "FieldValue")
{
var model = sender as CrossingUIModel;
if (model.FieldValue.Length == 1)
{
model.FieldValue = model.FieldValue.Substring(0,1);
model.IsFocus = false;
int id = model.Id;
if (id == 20)
{
var FocusControl = _page.FindByName<Entry>("Amt");
if (FocusControl != null)
{
FocusControl.Focus();
}
}
else
{
BindCrossingUIModel[id].IsFocus = true;
}
}
}
}
-xaml文件
<CollectionView.ItemTemplate>
<DataTemplate>
<!--<StackLayout HorizontalOptions="FillAndExpand">
<Entry x:Name="Fields" Text="{Binding FieldValue,Mode=TwoWay}"
ReturnType="Next" MaxLength="1" Keyboard="Numeric"
TextChanged="Fields_TextChanged" ></Entry>
</StackLayout>-->
<StackLayout WidthRequest="100" HorizontalOptions="FillAndExpand" >
<local:MyEntry WidthRequest="80" BackgroundColor="White" HeightRequest="50"
x:Name="Fields" Text="{Binding FieldValue,Mode=TwoWay}"
IsFocus="{Binding IsFocus,Mode=TwoWay}"
ReturnType="Next" Keyboard="Numeric" MaxLength="1"
></local:MyEntry>
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</StackLayout>
解决方法
您可以通过删除行model.IsFocus = false;
private void Model_PropertyChanged(object sender,PropertyChangedEventArgs e)
{
if (e.PropertyName == "FieldValue")
{
var model = sender as CrossingUIModel;
if (model.FieldValue.Length == 1)
{
model.FieldValue = model.FieldValue.Substring(0,1);
int id = model.Id;
if (id == 20)
{
var FocusControl = _page.FindByName<Entry>("Amt");
if (FocusControl != null)
{
FocusControl.Focus();
}
}
else
{
BindCrossingUIModel[id].IsFocus = true;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。