xamarin 表单中的自动完成功能

Posted

技术标签:

【中文标题】xamarin 表单中的自动完成功能【英文标题】:Autocomplete in xamarin forms 【发布时间】:2020-04-23 18:51:51 【问题描述】:

我正在使用此示例通过this 在 xamarin 表单中创建自动完成文本视图。但在本例中,他们在 mainActivity.cs onCreate() 中使用 AutoCompleteTextView。我如何在我的 xaml 表单中使用相同的代码

代码是:

protected override void OnCreate (Bundle bundle)

  base.OnCreate (bundle);

  // Set our view from the "Main" layout resource
  SetContentView (Resource.Layout.Main);

  AutoCompleteTextView textView = FindViewById<AutoCompleteTextView> (Resource.Id.autocomplete_country);
  var adapter = new ArrayAdapter<String> (this, Resource.Layout.list_item, COUNTRIES);

  textView.Adapter = adapter;

谢谢。

【问题讨论】:

***.com/questions/54245357/… 【参考方案1】:

您不能直接在 Xamarin.Forms 中使用 android 示例(包括 Xamarin.Android)。这些是不同的技术。

Xamarin.Forms 也可以在 ios 上运行(即使您不想要它),而 iOS 不会运行 Android 特定代码,这就是它不可能的主要原因。

除此之外,您可以使用自定义呈现器从本机控件构建 Xamarin.Forms 控件。所以基本上你可以让上面的示例在 Xamarin.Forms 上运行,但是由于知识和辛勤工作,需要比上面的示例更多的代码。

【讨论】:

感谢 Ivan 的建议,我对 xamarin.Forms 了解不多。所以,我无法做到这一点,但我在输入框下方使用列表视图并在文本更改时绑定数据。【参考方案2】:

我在我的 Xamarin.Forms 项目中做了类似的事情,该项目 100% 由 Android 和 iOS 共享 - 没有自定义渲染器。此示例使用 MVVM 模式和一些代码隐藏。我的视图模型包含 ListView 绑定到的对象的 IList。当用户使用查询表达式按下三个或更多字符时,它会更新。

private IList<myObject> results;
public IList<myObject> QueryResults

   get
   
     return results;
   
   set
   
     SetProperty(ref results, value);
   

在 OnTextChanged 处理程序中,我运行查询表达式并在每次击键时填充 QueryResults。这可能效率不高,但效果很好。

所以视图标记和代码隐藏是这样的:

    <StackLayout>
        <Label Style="StaticResource formLabel" Text="My Searchable List" />
        <!-- from poc -->
        <Grid WidthRequest="550">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="AUTO" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="350" />
            </Grid.ColumnDefinitions>
            <Frame Grid.Row="0" Style="StaticResource InputFrame" HeightRequest="49">
                <Entry x:Name="SearchText" Style="StaticResource formLabel" WidthRequest="550" HeightRequest="45" Text="Binding SearchString, Mode=TwoWay" TextChanged="Handle_TextChanged" />
            </Frame>
            <StackLayout Grid.Row="1" Orientation="Horizontal">
                <Frame x:Name="MyObjectFrame" Style="StaticResource InputFrame" HeightRequest="Binding ListHeight" HasShadow="true">

                    <ListView x:Name="MyObjectList" ItemsSource="Binding ResultantMyObjects" ItemSelected="OnItemSelected" HeightRequest="Binding ListHeight">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <TextCell Text="Binding Name" />
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </Frame>

            </StackLayout>

在代码隐藏中使用 Handle_TextChanged:

void Handle_TextChanged(object sender, Xamarin.Forms.TextChangedEventArgs e)
    
                    if (e.NewTextValue.Length > 2)
        
            (BindingContext as SampleDetailsViewModel).MySIteSearchResults(e.NewTextValue);
            this.ForceLayout();// force the change in heightrequest for ListView
            MyObjectList.IsVisible = true;
            MyObjectFrame.IsVisible = true;
        
        else
        
            MyObjectList.IsVisible = false;
            MyObjectFrame.IsVisible = false;
        
    

在视图模型中,我更新了上面的属性,注意返回值并没有在这个还不完美的例子中使用:

public List<MyObjectDTO> MyObjectSearchResults(string keystrokes)
    
        //TODO: encapsulate in a View
        List<MyObjectDTO> searchResults = null;
        IEnumerable<MyObjectDTO> queryResults;

            queryResults = from site in MyObjects
                           where site.Name.ToLower().Contains(keystrokes.ToLower())
                           select site;
            if (string.IsNullOrEmpty(SearchString))
            
                QueryResults = MyObjects;
            
            else
            
                QueryResults = queryResults.ToList<MyObjectDTO>();
                ListHeight = QueryResults.Count * 45; //TODO: detect size. magic number of 45 limits the height. 
            

        return searchResults;
    

注意:可能会有一些错误,因为我必须清理一些代码。

【讨论】:

以上是关于xamarin 表单中的自动完成功能的主要内容,如果未能解决你的问题,请参考以下文章

如何避免或禁用 Redux 表单文本输入中的自动完成功能?

网页禁用表单的自动完成功能禁用密码自动填充autocomplete

来自数组 JS 的自动完成输入表单

在Django中的文本字段上禁用自动完成?

带有自动完成功能的简单 Django 表单

移除 MVC 中的浏览器自动完成功能