【问题标题】:In Xamarin Forms how to call MainActivity's method or get MainActivity's 'Window' from another class?在 Xamarin Forms 中如何调用 MainActivity 的方法或从另一个类获取 MainActivity 的“窗口”?
【发布时间】:2019-12-31 17:31:07
【问题描述】:

我想在输入文本完成后隐藏软件按钮。当用户将手指放在键盘外时,会调用此方法:

 public override void OnUserInteraction()
        {
            base.OnUserInteraction();
            HideSoftwareMenuBars();
        }

效果很好:

 private void HideSoftwareMenuBars()
        {
            try
            {
                int uiOptions = (int)Window.DecorView.SystemUiVisibility;
                uiOptions |= (int)SystemUiFlags.LayoutStable;
                uiOptions |= (int)SystemUiFlags.LayoutHideNavigation;
                uiOptions |= (int)SystemUiFlags.LayoutFullscreen;
                uiOptions |= (int)SystemUiFlags.LowProfile;
                uiOptions |= (int)SystemUiFlags.HideNavigation;
                uiOptions |= (int)SystemUiFlags.Fullscreen;
                uiOptions |= (int)SystemUiFlags.ImmersiveSticky;
                this.Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
            }
            catch (System.Exception Ex)
            {
            }
        }

但是 MainActivity.cs 中没有方法可以覆盖当用户按下键盘上的“enter”键时调用的方法。我已经覆盖了 200 多种方法来检查它。然后在 Xamarin.Forms 后面的代码中我有事件:

private void Entry_Unfocused(object sender, FocusEventArgs e)
        {
            DependencyService.Get<ISoftwareButtons>().HideSoftwareMenuBars();
        }

然后通过调用依赖接口,这里我有2个错误:

[assembly: Dependency(typeof(SoftwareButtonsHandler))]
namespace Channel.Droid.DependencyHandlers
{
    public class SoftwareButtonsHandler
    {
        private void HideSoftwareMenuBars()
        {
            try
            {
                int uiOptions = (int) Window.DecorView.SystemUiVisibility;
                uiOptions |= (int)SystemUiFlags.LayoutStable;
                uiOptions |= (int)SystemUiFlags.LayoutHideNavigation;
                uiOptions |= (int)SystemUiFlags.LayoutFullscreen;
                uiOptions |= (int)SystemUiFlags.LowProfile;
                uiOptions |= (int)SystemUiFlags.HideNavigation;
                uiOptions |= (int)SystemUiFlags.Fullscreen;
                uiOptions |= (int)SystemUiFlags.ImmersiveSticky;
                this.Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
            }
            catch (System.Exception Ex)
            {
            }
        }
    }
}

问题是“Window.Devorview”有错误:

“顶级窗口外观和行为策略的抽象基类。 非静态字段、方法或对象需要对象引用 属性 'Window.DecorView;"

和“this.Window”

"SoftwareButtonsHandler' 不包含 'Window' 的定义和 没有可访问的扩展方法“窗口”接受第一个参数 可以找到类型“SoftwareButtonsHandler”(您是否缺少使用 指令还是程序集引用?”

有没有办法从另一个类调用 MainActivity.cs 的方法或在依赖处理程序中获取必要的“窗口”(只能在 MainActivity.cs 中访问)?

【问题讨论】:

    标签: xamarin xamarin.forms xamarin.android


    【解决方案1】:

    您可以在MainActivity 中创建一个MainActivityInstance 并将其设置为MainActivityInstance = thisOnCreate 中:

    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        public static MainActivity MainActivityInstance { get; private set; }
    
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;
    
            base.OnCreate(savedInstanceState);
    
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    
            MainActivityInstance = this;
    
            LoadApplication(new App());
        }
    }
    

    然后就可以在依赖接口中获取MainActivity了:

    public class SoftwareButtonsHandler : ISoftwareButtons
    {
    
        void ISoftwareButtons.HideSoftwareMenuBars()
        {
            try
            {
                int uiOptions = (int)MainActivity.MainActivityInstance.Window.DecorView.SystemUiVisibility;
                uiOptions |= (int)SystemUiFlags.LayoutStable;
                uiOptions |= (int)SystemUiFlags.LayoutHideNavigation;
                uiOptions |= (int)SystemUiFlags.LayoutFullscreen;
                uiOptions |= (int)SystemUiFlags.LowProfile;
                uiOptions |= (int)SystemUiFlags.HideNavigation;
                uiOptions |= (int)SystemUiFlags.Fullscreen;
                uiOptions |= (int)SystemUiFlags.ImmersiveSticky;
                MainActivity.MainActivityInstance.Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
            }
            catch (System.Exception Ex)
            {
    
            }
        }
    }
    

    【讨论】:

    • 我无法获得对 MainActivity 公共静态对象的引用。我是否需要添加一个 Using 指令,或者以某种方式添加一个依赖项?这是一个跨平台的 Forms 项目。
    【解决方案2】:

    您可以对 MainActivity 进行静态引用,以便在任何地方访问,或者您可以使用 CurrentActivity 插件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      相关资源
      最近更新 更多