SoftInput.AdjustResize导致键盘在显示或隐藏时闪烁

时间:2020-02-20 15:58:50

标签: android xamarin android-activity xamarin.forms xamarin.android

WindowSoftInputMode设置为Android.Views.SoftInput.AdjustResize后,Android出现了问题。当键盘显示或隐藏时,我们的启动屏幕会在键盘设置动画的位置上方闪烁。这是很烦人的。

这是其中的一个片段,您可以看到飞溅的东西在后面偷看。

2 个答案:

答案 0 :(得分:1)

从我可以看出,这可能是问题所在。 如果您在Styles.xml中设置SplashScreen,则如下所示:

<style name="MainTheme.Splash" parent ="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@drawable/splashscreen</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
  </style>

并且不仅将LoginActivity(登录屏幕)设置为MainLaucher,初始屏幕也不会被丢弃,它将贯穿整个应用程序。想象一下,在启动屏幕上有更大的图像并将其拖过整个应用程序,过一会儿会导致内存泄漏。


如何修复它。 创建类似于中间件活动的内容,该内容将与初始屏幕相同,例如

[Activity(Theme = "@style/MainTheme.Splash", MainLauncher = true, NoHistory = true, Icon = "@drawable/appicon")]
    public class SplashActivity : AppCompatActivity
    {

        public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState)
        {
            base.OnCreate(savedInstanceState, persistentState);

        }

        // Launches the startup task
        protected override void OnResume()
        {
            base.OnResume();
            Task startupWork = new Task(() => { SimulateStartup(); });
            startupWork.Start();
        }

        // Simulates background work that happens behind the splash screen
        async void SimulateStartup()
        {
            await Task.Delay(500); // Simulate a bit of startup work. You can remove this 
            StartActivity(typeof(LoginActivity)); // Your Activity

        }
    }
}

不只是使用全新的LoginActivity

[Activity(Label = "LoginActivity")]
    public class LoginActivity : AppCompatActivity
    {
    }

答案 1 :(得分:0)

可能有点晚了,但是对于熟悉此问题的人来说,这可能是另一种解决方案。我从上面的代码创建了一个启动屏幕,并在MainActivity OnCreate方法内设置了RequestFeature和Theme。我还注意到将android:windowFullscreen设置为false可以解决此问题。这是我的代码段。

创建Spash主题

<style name="MyTheme.Splash" parent ="MainTheme.Base">
 <item name="android:windowBackground">@drawable/splash</item>
 <item name="android:windowNoTitle">true</item>  
 <item name="android:windowFullscreen">false</item>  
 <item name="android:windowContentOverlay">@null</item>  
 <item name="android:windowActionBar">true</item>  
 </style>

在MainAvtivity上设置主题

  protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;
            base.Window.RequestFeature(WindowFeatures.ActionBar);
            base.SetTheme(Resource.Style.MainTheme);
            base.OnCreate(savedInstanceState);           
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App(path));
        }