始终保持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;

                }
            }

        }