【问题标题】:Xamarin android focus change from Picker to Entry does not open KeyboardXamarin android 焦点从 Picker 更改为 Entry 未打开键盘
【发布时间】:2022-01-11 12:12:27
【问题描述】:

我有一堆条目和选择器,我希望焦点自动切换到下一个条目/选择器。 我通过调用我想要关注的 Entry/Picker 上的 Focus() 方法来做到这一点。如果我当前的焦点在一个条目上,而我的下一个元素是一个条目或一个选择器,它会改变焦点并按预期打开键盘/选择器对话框。如果我当前的焦点在一个 Picker 上,而下一个元素是一个 Entry,那么该 Entry 会按预期获得焦点,但键盘不会打开。 在 Pickers SelectedIndexChanged 事件中调用 focus() 方法。 我该如何解决?

xml代码:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:d="http://xamarin.com/schemas/2014/forms/design"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         mc:Ignorable="d"
         x:Class="ABM.Ablesegeraet.Views.TourenLadenPage"
         Title="Touren laden">
<ContentPage.Content>
    <StackLayout>
    <Label Grid.Row="0" Grid.Column="0" Margin="30,10,0,0" FontSize="Medium" Text="Mandant:"/>
    <Picker x:Name="MandantenPicker" ItemDisplayBinding="{Binding Ort}" Title="Mandant" Grid.Row="0" Grid.Column="1" SelectedIndexChanged="MandantPicker_SelectedIndexChanged"/>
    <Entry Grid.Row="1" x:Name="test"/>
    </StackLayout>
</ContentPage.Content>

SelectedIndexcChanged:

private void MandantPicker_SelectedIndexChanged(object sender, EventArgs e)
    {
        test.Focus();
    }

【问题讨论】:

  • 请发布足够多的代码以查看到底发生了什么。显示定义具有焦点的 picker 的 xaml(或 cs),以及接下来转到的 entry。显示包含 focus 调用的 SelectedIndexChanged 方法。另外,您是在设备上还是在模拟器上进行测试?如果是模拟器,我建议附加一个物理设备 - 以确保它不仅仅是模拟器的奇怪之处。 (因为模拟器在连接了物理键盘的电脑上运行,所以软键盘可能没有在应该打开的时候打开)
  • @ToolmakerSteve 我添加了代码。我也不使用模拟器。我使用物理设备。

标签: xamarin xamarin.forms xamarin.android


【解决方案1】:

Picker 在 Picker 的 SelectedIndexChanged 方法中没有失去焦点,然后如果设置 Entry.Focus 会导致显示错误。

解决方法是在SelectedIndexChanged方法运行后Picker失去焦点,然后设置Entry.Focus正确显示。

使用Task打开一个新线程来完成这个操作。

这是背景代码:

public partial class MainPage : ContentPage
{   
    public MainPage()
    {
        InitializeComponent();
    }
    private async void picker_SelectedIndexChanged(object sender, EventArgs e)
    {
        var a = picker.IsFocused;
        string res = (sender as Picker).SelectedItem.ToString();
        Task.Run(()=> myTask(res));//Create and start the thread
    }

    private void myTask(string res)
    {
        Thread.Sleep(300);
        var a = picker.IsFocused;
        if (res == "Test1")
        {
            entry1.Focus();
        }
        if (res == "Test2")
        {
            entry2.Focus();
        }    
    }
}

【讨论】:

  • 这确实有效...我之前确实尝试过使用任务,但它没有工作...也许我昨天做错了什么。不过谢谢!
猜你喜欢
  • 2019-03-03
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 2016-12-13
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多