2013-10-22 9 views
5

में घुमाए जाने पर पृष्ठ को पुनः लोड करने से एंड्रॉइड वेबव्यू को रोकना मुझे एहसास है कि इससे संबंधित कई प्रश्न हैं लेकिन मैंने देशी विकास के लिए सभी समाधानों का प्रयास किया है और उन्हें ज़ैमरिन के तहत काम करने के लिए नहीं मिल सकता है।Xamarin पर्यावरण

मेरे पास एक वेबदृश्य है जो एक यूआरएल से भरा हुआ है जिसमें ड्राइंग के लिए ग्राफिकल यूआई है। जब डिवाइस घुमाया जाता है तो वेबव्यू पृष्ठ को फिर से लोड करता है और उपयोगकर्ता का काम गुम हो जाता है।

निम्न ब्लॉग पोस्ट यह करने के लिए सबसे अच्छा समाधान प्रदान करता है और बताता है कि व्यापक रूप से प्रलेखित समाधान निम्न कारण sufficicient नहीं है:

http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/

इस कार्यान्वयन के साथ मुख्य समस्या यह है कि, जब भी है आप स्क्रीन को घुमाते हैं,> वेबव्यू फिर से बनाया जाता है क्योंकि गतिविधि नष्ट हो जाती है और इसकी सेवस्टेट विधि पूरी स्थिति को सहेजती नहीं है, लेकिन इसका केवल एक हिस्सा लोड किया गया पृष्ठ और यूआरएल ब्राउज़िंग इतिहास की तरह ही इसका एक हिस्सा है। तो ऐसा होता है कि उदाहरण के लिए ज़ूम और स्क्रॉल स्थिति> स्क्रीन अभिविन्यास परिवर्तन के बाद संरक्षित नहीं होती है और कभी-कभी पृष्ठ को वेब से पुनः लोड किया जाता है।

इसलिए मैंने अपना समाधान लागू किया है, इसे जावा से एक्समरिन सी # में पोर्ट किया है। यह आशाजनक लग रहा है लेकिन जब भी मेरी गतिविधि पुनः लोड हो जाती है और इनिटूई को कॉल किया जाता है, तो वेब_व्यू क्लास वेरिएबल हमेशा शून्य होता है जबकि उदाहरण इस श्रेणी चर पर निर्भर करता है जो डिवाइस रोटेशन के बीच अपना मान रखता है।

कोई भी विचार है कि क्यों 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

क्या आपने लिंक किए गए आलेख में वर्णित AndroidManifest.xml में परिवर्तन किए हैं? –

+0

हाँ, मेरे AndroidManifest.xml इस प्रकार है <गतिविधि एंड्रॉयड: नाम = "EbookViewerActivity।" एंड्रॉयड: configChanges = "कुंजीपटल | keyboardHidden | screenSize | उन्मुखीकरण" एंड्रॉयड: लेबल = "Eworkbook व्यूअर" />

उत्तर

4

AndroidManifest.xml बदल सकते हैं और कस्टम विशेषताओं का उपयोग न करें।

[Activity(ConfigurationChanges=ConfigChanges.Orientation | ConfigChanges.ScreenSize)] 
    public partial class MyActivity : Activity { ... 

इस समाधान ने मेरे साथ काम किया है।