Я использую 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?