Xamarin Android обновить источник (LoadUrl) веб-просмотра - PullRequest
0 голосов
/ 08 января 2020

Я использую Xamarin Android и MVVMCross для разработки своего приложения. В рамках одного из моих взглядов у меня есть элемент веб-просмотра (среди прочих). Я использую этот элемент для встраивания видео YouTube. Если я жестко закодирую URL-адрес, например "https://www.youtube.com/embed/AAAAAAAA", это прекрасно работает.

view. xml:

...
 <android.webkit.WebView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:id="@+id/webView"
 />
...

view.cs:

protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.taskdetail_view);
            var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar(toolbar);
            SupportActionBar.SetDisplayHomeAsUpEnabled(true);

            var toolbarTitle = FindViewById<Android.Widget.TextView>(Resource.Id.toolbarTitle);
            toolbarTitle.Text = ViewModel.TaskName;

            var webView = FindViewById<WebView>(Resource.Id.webView);
            WebSettings settings = webView.Settings;
            settings.JavaScriptEnabled = true;
            webView.SetWebChromeClient(new WebChromeClient());
            webView.LoadUrl("https://www.youtube.com/embed/AAAAAAAA");
        }

Пока все хорошо. Теперь я хотел бы вставить строку для метода LoadUrl программно. Поэтому я создал класс обслуживания, который выполняет веб-вызов API данных YouTube для получения идентификатора видео. После того как API вернул идентификатор видео, свойство publi c в модели представления обновляется с этим идентификатором. Все это прекрасно работает, но как мне обновить источник веб-просмотра? Я подумал о чем-то вроде:

string videoURL = ViewModel.YoutubeVideoId;
 ...
webView.LoadUrl(videoURL);

Но поскольку веб-представление настроено в методе представления OnCreate, вызов API еще не сделан, а свойство в модели представления по-прежнему равно нулю.

Так что, в конечном счете, моей целью было бы отобразить представление, а затем запустить вызов API в фоновом режиме, когда вызов завершит обновление источника веб-просмотра. Наиболее удобным было бы использовать привязку mvvmcross, но, похоже, это не работает из коробки. Так как я могу это сделать?

ОБНОВЛЕНИЕ

Я получил его на работу с помощью таймера. В методе OnCreate в представлении я использую этот код:

timer = new Timer
{
   Enabled = true,
   Interval = 500
};
timer.Elapsed += OnTimeEvent;

И затем я объявляю функцию OnTimeEvent:

private void OnTimeEvent(object sender, System.Timers.ElapsedEventArgs e)
        {
            RunOnUiThread(() =>
            {
                if(ViewModel.YoutubeVideoId != "https://www.youtube.com/embed/")
                {
                    timer.Dispose();
                    string videoURL = ViewModel.YoutubeVideoId;
                    var webView = FindViewById<WebView>(Resource.Id.webView);
                    WebSettings settings = webView.Settings;
                    settings.JavaScriptEnabled = true;
                    webView.SetWebChromeClient(new WebChromeClient());
                    webView.LoadUrl(videoURL);
                    webView.Visibility = ViewStates.Visible;

                    var progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar1);
                    progressBar.Visibility = ViewStates.Gone;
                }
            });
        }

Конечно, использование таймера - не лучшее решение. Есть ли способ реализовать что-то вроде обратного вызова, который выполняется после обновления ViewModel.YoutubeVideoId?

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