(Xamarin - Android) Вызывать публичный метод в классе Activity из другого класса? - PullRequest
0 голосов
/ 17 мая 2018

Я разрабатываю приложение на Xamarin.Я пытаюсь скрыть изображение при загрузке веб-страницы.Я пробую разные методы, такие как вызов публичной функции или доступ к просмотру изображений из другого класса.

Я читаю Этот , но он не работает на 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**
        }

    }

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Гораздо более простой подход к получению активности из другого класса, который также менее подвержен ошибкам и менее подвержен утечкам памяти, заключался бы в получении активности из контекста представления.

В вашем MyWebViewClient class:

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();
    }
}

ИспользованиеПодход, подобный этому, намного легче поддерживать в будущем.

0 голосов
/ 17 мая 2018

По совету Джейсона я попробую кое-что, и это сработает.

  public class MainActivity : Activity
    {
     protected override void OnCreate(Bundle savedInstanceState)
        {
           base.OnCreate(savedInstanceState);
           .
           .
           .
           my_web_client = new MyWebViewClient(this);
           .
           .
           .
       }

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

 public class MyWebViewClient : WebViewClient
    {
        MainActivity act;
        public MyWebViewClient(MainActivity activity)
        {
            this.act = activity;
        }

        public override void OnPageFinished(WebView view, string url)
        {
            base.OnPageFinished(view, url);
            act.Hide_Splash();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...