首页 > 解决方案 > (Xamarin - Android)从另一个类调用 Activity 类中的公共方法?

问题描述

我在 Xamarin 上开发了一个应用程序。我尝试在加载 webview 页面时隐藏图像。我尝试了不同的方法,例如调用公共函数或从另一个类访问 imageview。

我读了这个,但它不适用于 Xamarin。

所以我尝试了一些

[Activity(Label = "XamarinWebView", Theme = "@android:style/Theme.Black.NoTitleBar", MainLauncher = true)]
     public class MainActivity : Activity
      {
         WebView app_view = null;
         WebSettings app_web_settings = null;
         WebChromeClient web_client;
         MyWebViewClient my_web_client;
         ImageView my_splash = null;

       protected override void OnCreate(Bundle savedInstanceState)
            {
                base.OnCreate(savedInstanceState);
                SetContentView(Resource.Layout.Main);
                app_view = FindViewById(Resource.Id.webViewapp) as WebView;
                my_web_client = new MyWebViewClient(this.ApplicationContext);
                app_view.SetWebViewClient(my_web_client);
                string app_url = "file:///android_asset/app_pages/test.html";
                app_view.LoadUrl(app_url);

                my_splash = FindViewById(Resource.Id.imageSplash) as ImageView;
 my_splash.SetImageDrawable(GetDrawable(Resource.Drawable.splash));
            }

        public void HideSplash()
        {
             my_splash.Visibility = ViewStates.Gone;
        }

    }

在这个类中,我可以获得 WebView 页面加载状态。

public class MyWebViewClient : WebViewClient
    { 
        Context context;
        public MyWebViewClient(Context _context) {
            this.context = _context;
        }

        public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
        {
            base.OnPageStarted(view, url, favicon);
        }

        public override void OnPageFinished(WebView view, string url)
        {
            base.OnPageFinished(view, url);
            **I need to change visible my_splash**
        }

    }

标签: androidxamarinandroid-activityxamarin.android

解决方案


从另一个类中获取活动的更简单的方法是从视图上下文中获取活动,这也不太容易出错并且不太可能导致内存泄漏。

在你的MyWebViewClient课堂上:

public override void OnPageFinished(WebView view, string url)
{
    base.OnPageFinished(view, url);
    (view.Context as MainActivity).HideSplash();
}

或者,如果您不确定上下文是否始终是MainActivity您可以使用覆盖空检查的模式匹配:

public override void OnPageFinished(WebView view, string url)
{
    base.OnPageFinished(view, url);
    if(view.Context is MainActivity mainActivity)
    {
        mainActivity.HideSplash();
    }
}

使用这样的方法更容易维护。


推荐阅读