我意识到有很多与此相关的问题,但我已经尝试了所有原生开发解决方案,但无法让它们在 Xamarin 下工作。
我有一个 webview,它加载了一个包含用于绘图的图形 UI 的 URL。当设备旋转时,webview 会重新加载页面并且用户的工作会丢失。
以下博客文章对此提供了最佳解决方案,并解释了广泛记录的解决方案是不够的,原因如下:
此实现的主要问题是,每当您旋转屏幕时,都会再次创建 >WebView,因为活动已被销毁,并且它的 saveState 方法不会 >保存完整状态,而只是保存其中的一部分,例如已加载的页面和 > 浏览历史记录。因此,例如缩放和滚动位置在屏幕方向更改后不会>保留,有时页面会从网络重新加载。
所以我实现了他们的解决方案,将它从 Java 移植到 Xamarin C#。它看起来很有希望,但是每当我的活动重新加载并调用 InitUi 时,web_view 类变量始终为空,而示例依赖于此类变量在设备旋转之间保存其值。
任何人都知道为什么 web_view 失去了它的价值?
这是我的代码,它与文章完全相同,但移植到 Xamarin C#。
public class EbookViewerActivity : ActionBarActivity
{
protected WebView web_view;
protected FrameLayout webViewPlaceholder;
Button loadButton;
Button downloadButton;
EditText testUrlText;
private string viewerPath;
protected override void OnCreate(Bundle savedInstanceState)
{
#region Set up activity and action bar
//Create the activity screen and initialise the action bar
base.OnCreate(savedInstanceState);
RequestWindowFeature(WindowFeatures.NoTitle);
SetContentView(Resource.Layout.Viewer);
InitializeActionBar();
//Set action bar button delegates
ActionBar
.AddLeftAction(new DelegateAction(Finish, Resource.Drawable.CloseIcon))
.SetTitle("Ebook Annotator");
//Set action bar logo
ActionBar.SetHomeLogo(Resource.Drawable.AcmeTrainingLogo);
#endregion
InitUi();
}
private void InitUi()
{
Logger logger = Logger.Instance;
// Retrieve UI elements
webViewPlaceholder = FindViewById<FrameLayout>(Resource.Id.webViewPlaceholder);
// Initialize the WebView if necessary
if (web_view == null)
{
web_view = new WebView(this);
web_view.Id = Resource.Id.ebookDynamicWebView;
//web_view = FindViewById<WebView>(Resource.Id.ebookWebview);
web_view.Settings.JavaScriptEnabled = true;
web_view.AddJavascriptInterface(new AnnotationApiProxy(this), "AnnotationApi");
string ebookId = Intent.GetStringExtra("ebookId");
string userEmail = Intent.GetStringExtra("userEmail");
Ebook ebook = EbookManager.GetEbook(int.Parse(ebookId));
GlobalVariableHolder.Instance.EbookToOpen = int.Parse(ebookId);
viewerPath = "file:///android_asset/Annotator/annotator.html";
web_view.Settings.AllowFileAccess = true;
logger.WriteToLog("Loading test harness with ebook id: " + ebookId, LogEntryLevel.Message);
web_view.SetWebChromeClient(new EbookWebViewClient() { });
// web_view.SetWebViewClient(new WebViewClient());
AnnotationDownloader annotationDownloader = new AnnotationDownloader();
// annotationDownloader.XmlDownloaded += (sender, args) => RunOnUiThread(() =>
// {
web_view.LoadUrl(viewerPath);
// });
annotationDownloader.GetLatestEWorkBookXml(ebook.ID, userEmail);
}
// Attach the WebView to its placeholder
webViewPlaceholder.AddView(web_view);
}
protected override void OnSaveInstanceState(Bundle outState)
{
base.OnSaveInstanceState(outState);
// Save the state of the WebView
web_view.SaveState(outState);
}
protected override void OnRestoreInstanceState(Bundle savedInstanceState)
{
base.OnRestoreInstanceState(savedInstanceState);
// Restore the state of the WebView
web_view.RestoreState(savedInstanceState);
}
public override void OnConfigurationChanged(Configuration newConfig)
{
if (web_view != null)
{
// Remove the WebView from the old placeholder
webViewPlaceholder.RemoveView(web_view);
}
base.OnConfigurationChanged(newConfig);
// Load the layout resource for the new configuration
SetContentView(Resource.Layout.Viewer);
// Reinitialize the UI
InitUi();
}
}