Xamarin.Forms icon indicating copy to clipboard operation
Xamarin.Forms copied to clipboard

Soft keyboard does not appear for entry field on first page shown by app - Android only

Open Szymaniuk opened this issue 7 years ago • 11 comments

Description

Soft keyboard does not appear for entry field on first page shown by app - Android only (there is no issue on iOS) Based on - https://bugzilla.xamarin.com/show_bug.cgi?id=51854

Steps to Reproduce

  1. Implement simplest app, that would contain Page with Entry, where during OnAppearing there will be invoked Focus() for this entry. I.e.:
using System;
using Xamarin.Forms;

namespace XamFormsSoftKeyboardIssue
{
    class SamplePasscodePage : ContentPage
    {
        private readonly Entry _passcodeEntry;

        public SamplePasscodePage(Action openAnotherPage)
        {
            _passcodeEntry = new Entry
            {
                Keyboard = Keyboard.Numeric,
                IsPassword = true,
                VerticalOptions = LayoutOptions.Start,
                HorizontalOptions = LayoutOptions.Fill,
            };

            var button = new Button
            {
                Text = "Open Another Page",
                Command = new Command(openAnotherPage)
            };

            Content = new StackLayout
            {
                Children =
                {
                    _passcodeEntry,
                    button
                }
            };
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            _passcodeEntry.Focus();
        }

        protected override void OnDisappearing()
        {
            _passcodeEntry.Unfocus();
            base.OnDisappearing();
        }
    }

    public class App : Application
    {
        public App()
        {
            OpenPasscodePage();
        }

        private void OpenPasscodePage()
        {
            MainPage = new SamplePasscodePage(OpenAnotherPage);
        }

        private void OpenAnotherPage()
        {
            MainPage = new ContentPage
            {
                Content = new Button
                {
                    Text = "Open Passcode Page Again",
                    Command = new Command(OpenPasscodePage),
                    VerticalOptions = LayoutOptions.Center,
                    HorizontalOptions = LayoutOptions.Center
                }
            };
        }
    }
}

Expected Behavior

After showing SamplePasscodePage, and invoking Focus() for Entry, keyboard should appeared.

Actual Behavior

After showing SamplePasscodePage, and invoking Focus() for Entry, keyboard sometimes appears, but sometimes does not appear.

Workaround

I've found out, that delaying invoking of Focus() (with at least 250ms, but it's just by trial and error...), affects 95-99% cases, when keyboard appears, as expected. I.e.:

protected override void OnAppearing()
{
    base.OnAppearing();
    Device.BeginInvokeOnMainThread(async () =>
    {
        await System.Threading.Tasks.Task.Delay(250);
        _passcodeEntry.Focus();
    });
}

Basic Information

  • Version with issue: 2.5.1.317207-pre1, 2.5.0.122203, 2.4.0.269-pre2, 2.3.4, 2.3.4.184-pre1, 2.3.3.180
  • Last known good version: none!
  • IDE: Visual Studio for Mac, Visual Studio 2017 15.6.0
  • Platform Target Frameworks:
    • Android: 8.1
  • Android Support Library Version: 27.0.2
  • Nuget Packages: Xamarin.Forms.2.5.1.317207-pre1.nupkg
  • Affected Devices: Meizu M2 Mini

Screenshots

Reproduction Link

Szymaniuk avatar Mar 14 '18 08:03 Szymaniuk

I have what I assume is the same issue. It's not the first page in my app though, it's the first child page that's displayed in a fresh TabbedPage. All other child pages properly focus the entry when calling Focus() in their OnAppearing(), but it doesn't work in the first child page.

vaindil avatar Jun 01 '18 18:06 vaindil

This is over a year old, is there a fix yet?

SeekaMartin avatar Jun 11 '19 20:06 SeekaMartin

This issue doesn't seem to have had any activity in a long time. We're working on prioritizing issues and resolving them as quickly as we can. To help us get through the list, we would appreciate an update from you to let us know if this is still affecting you on the latest version of Xamarin.Forms, since it's possible that we may have resolved this as part of another related or duplicate issue. If we don't see any new activity on this issue in the next 30 days, we'll evaluate whether this issue should be closed. Thank you!

samhouts avatar Jun 12 '20 20:06 samhouts

Still happens with Xamarin.Forms 4.5.0.356

JuanuMusic avatar Jun 17 '20 21:06 JuanuMusic

This still doesnt work in 4.7. I'm using similar code with a search handler in forms shell. Calling Focus() in OnAppearing will focus the control but not open the soft keyboard.

TurtleSwift avatar Jul 13 '20 15:07 TurtleSwift

Still doesn't work, it is a shame.

zakx avatar Aug 04 '20 00:08 zakx

When will it get fixed?

Ajitkumar13 avatar Aug 05 '20 10:08 Ajitkumar13

When will this be fixed? There seems to always be something broken with Xamarin. You have no idea how many times that I have been reprimanded over these kinds of issues that are totally out of my hands.

donaldashworth avatar Dec 01 '20 18:12 donaldashworth

I encountered the same issue with on 5.0. I had similar issues before with other control methods, liking scrolling to the end of a view. In both cases the workaround was to add some async delay in OnAppearing before setting focus (or scrolling). Here I required a delay of 200ms to consistently get the keyboard. Looks like there's some setup timing issues/races.

imsodin avatar Feb 08 '21 11:02 imsodin

I encountered the same issue with on 5.0. I had similar issues before with other control methods, liking scrolling to the end of a view. In both cases the workaround was to add some async delay in OnAppearing before setting focus (or scrolling). Here I required a delay of 200ms to consistently get the keyboard. Looks like there's some setup timing issues/races.

Worked for me. Thanks

hassanyasinEF avatar Feb 10 '21 09:02 hassanyasinEF

protected override async void OnAppearing()
{
    base.OnAppearing();

    await Task.Delay(200);

    fro_SearchBar.Focus();
}

This is not working for me. I am opening new page and I want to focus SearchBar with opened keyboard. Right now focus is set to SearchBar but keyboard is not shown.

EDIT: It works with entry even without delay. Issue is with SearchBar but this topic is not about it.

Kalyxt avatar Mar 14 '24 16:03 Kalyxt