我意识到有很多与此有关的问题,但我已经尝试了所有本地开发的解决方案,并且无法让它们在Xamarin下工作。
我有一个webview,其中加载了一个包含用于绘图的图形UI的URL。当设备旋转时,webview会重新加载页面,用户的工作也会丢失。
以下博客文章为此提供了最佳解决方案,并解释了由于以下原因,广泛记录的解决方案并不充分:
此实现的主要问题是,无论何时旋转屏幕,都会再次创建> WebView,因为活动已被销毁且其saveState方法不会>保存完整状态,而只是保存完整状态的一部分比如已加载页面的URL和>浏览历史记录。因此,例如,在屏幕方向改变后有时不会保留缩放和滚动位置,有时会从网络重新加载页面。
所以我已经实现了他们的解决方案,将其从Java移植到Xamarin C#。它看起来很有希望,但每当我的活动重新加载并调用InitUi时,web_view类变量始终为null,而该示例依赖于此类变量在设备轮换之间保持其值。
任何人都知道为什么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();
}
}
答案 0 :(得分:4)
请勿更改 AndroidManifest.xml 并使用自定义属性。
[Activity(ConfigurationChanges=ConfigChanges.Orientation | ConfigChanges.ScreenSize)]
public partial class MyActivity : Activity { ...
此解决方案与我合作。