2012-08-26 15 views
52

पर वेबव्यू रीलोड को रोकना जब मैं अपनी स्क्रीन घुमाता हूं, तो वेबव्यू पूरे पृष्ठ को पुनः लोड करता है। मेरे पास यह नहीं हो सकता है क्योंकि मेरी कुछ सामग्री में गतिशील/यादृच्छिक सामग्री है। वर्तमान में जब स्क्रीन घुमाएगी तो लोड यूआरएल() विधि से मूल यूआरएल पुनः लोड हो जाता है।एंड्रॉइड - घुमाव

कोई भी विचार मेरे कोड में क्या गलत है?

MainActivity.java

package com.mark.myapp; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class MainActivity extends Activity { 

    WebView web; 
    String webURL = "http://www.google.co.uk/"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (savedInstanceState != null) 
      ((WebView)findViewById(R.id.web)).restoreState(savedInstanceState); 

     web = (WebView) findViewById(R.id.web); 
     web.getSettings().setJavaScriptEnabled(true); 
     web.loadUrl(webURL); 
     web.setPadding(0, 0, 0, 0); 
     web.getSettings().setLoadWithOverviewMode(true); 
     web.getSettings().setUseWideViewPort(true); 
     web.getSettings().setSupportZoom(true); 
     web.getSettings().setBuiltInZoomControls(true); 

     web.setWebViewClient(new HelloWebViewClient()); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    private class HelloWebViewClient extends WebViewClient { 
     public boolean shouldOverrideUrlLoading(WebView web, String url) { 
      web.loadUrl(url); 
      return true; 
     } 
    } 

    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) { 
      web.goBack(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

} 

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.mark.myapp" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 

      android:configChanges="orientation|keyboardHidden"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
    <uses-permission android:name="android.permission.INTERNET"/> 
</manifest> 
+0

सरलीकृत समाधान जो मैं अपने आप को इस्तेमाल किया और ले कर यहाँ है: http://twigstechtips.blogspot.com/2013/08/android-retain-instance-of-webview.html –

उत्तर

59

मुझे लगता है कि मुख्य समस्या यह है कि आप web.loadUrl (webURL) कहते हैं; ! भी जब savedInstanceState = अशक्त

संपादित

प्रयास करें:

if (savedInstanceState == null) 
{ 
    web.loadUrl(webURL); 
} 

EDIT2: तुम भी onSaveInstanceState और onRestoreInstanceState ओवरराइड की जरूरत है।

@Override 
protected void onSaveInstanceState(Bundle outState) 
{ 
super.onSaveInstanceState(outState); 
web.saveState(outState); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) 
{ 
super.onRestoreInstanceState(savedInstanceState); 
web.restoreState(savedInstanceState); 
} 
+1

हाँ! यह मेरे लिए काम करता है (संपादन के बाद, टिम देखा!)! धन्यवाद! क्या आप संभवतः समझा सकते हैं कि यह क्यों और कैसे काम करता है और उन विधियों को ओवरराइड करने की आवश्यकता क्यों है? – mark

+0

@mark देखें http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges – Giuseppe

+0

एक आखिरी बात, क्या मुझे वास्तव में निम्नलिखित कथन की आवश्यकता है: अगर (savedInstanceState! = Null) ((WebView) findViewById (R.id.web)) restoreState (savedInstanceState)। – mark

49

कोई जावा कोडिंग आवश्यक नहीं है। इसे अपनी मेनिफेस्ट फ़ाइल में उपयोग करें।

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 

की तरह:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.Example.WebviewSample.webviewsample" 
     android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity>   
</application> 
+2

आप किस परिवर्तन के बारे में बात कर रहे हैं? –

+0

@Mgamerz टिप्पणी के बाद .. जब मामला घूर्णन हो रहा है .. यह सबसे बुरा सुझाव है कि आप –

+31

Noooooooooooo दे सकते हैं। ऐसा करने के बारे में भी मत सोचो। कॉन्फ़िगरेशन परिवर्तन रोटेशन तक ही सीमित नहीं हैं। इसके अलावा, कम स्मृति से वापस आने के बाद इंस्टेंस स्थिति को पुनर्स्थापित किया जा सकता है। यहां समस्या यह है कि जब आप ऐसा करते हैं तो कॉन्फ़िगरेशन सही तरीके से अपडेट नहीं किया जाएगा। कृपया, कोई भी ऐसा नहीं करता है। –

2

अवहेलना onConfigChange विधि AndroidMainfest फ़ाइल में आपकी गतिविधि के उन्मुखीकरण परिवर्तन

पर डेटा को फिर से लोड से बचने के लिए।

android:configChanges="orientation|keyboardHidden" 

और इन के रूप में अच्छी तरह से अपने WebView में है सेटिंग्स

webview.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
webview.loadUrl("Your URL To Load"); 
4

टैग (प्रकट)

android:configChanges="orientation|screenSize" 

कक्षा में में प्रकट

<activity 
    ... 
    android:configChanges="orientation|screenSize"> 
14

में यह कोड जोड़ें

@Override 
    public void onConfigurationChanged(Configuration newConfig){   
    super.onConfigurationChanged(newConfig); 
    } 
+5

वास्तव में '' ऑन कॉन्फ़िगरेशन चेंज'' विधि को ओवरराइड करने का कोई कारण नहीं है क्योंकि कोई कस्टम कार्यक्षमता नहीं जोड़ा गया है। बस मैनिफेस्ट फ़ाइल में बदलाव करने के लिए मेरे लिए चाल थी। – i2097i

+0

एक और पूरा उत्तर: https://stackoverflow.com/a/46849736/454780 – trusktr

9

मेरे लिए प्रकट कार्यों में android:configChanges="orientation|screenSize" जोड़ना

<activity 
      android:name="com.example.HelloWorld.WebActivity" 
      android:label="@string/title_activity_web" 
      android:configChanges="orientation|screenSize" > 
</activity> 
+0

क्या आप वेबव्यू के संबंध में अपनी मुख्य गतिविधि क्या पोस्ट कर सकते हैं? – trusktr

5

मैं नहीं मानता कि यह अब और काम करेंगे। मेरे मामले में, WebView.restore(Bundle savedInstanceState) का उपयोग कर राज्य को पुनर्स्थापित करना अभी भी यूआरएल का पुनः लोड ट्रिगर करता है।

restoreState() के लिए docs को देखते हुए आप देखेंगे यह कहते हैं:

अगर यह करने के बाद इस WebView राज्य (लोड पृष्ठों का निर्माण करने, एक वापस/आगे सूची बनाते हैं, आदि का अवसर मिल सके कहा जाता है) अवांछित साइड इफेक्ट्स हो सकते हैं।

और

कृपया ध्यान दें कि इस विधि द्वारा अब इस WebView के लिए प्रदर्शन डेटा पुनर्स्थापित करता है।

@ e4c5 करने के लिए सही दिशा में मुझे इशारा कर के लिए

प्रॉप्स उसकी answer

और निश्चित रूप से, कार्रवाई का चरम पाठ्यक्रम गतिविधि विनाश/निर्माण आरंभ होने से उन्मुखीकरण परिवर्तन रोकने के लिए किया जाएगा। ऐसा करने के तरीके के लिए दस्तावेज़ है here

0

अपने मैनिफ़ेस्ट फ़ाइल में इस प्रयास करें:

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 
1

प्लेस Manifest.xml फ़ाइल गतिविधि में इस:

android:configChanges="orientation|screenSize" 

यहाँ एक उदाहरण है:

<activity android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:configChanges="orientation|screenSize"> 
      <intent-filter> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
</activity> 
1

उद्धृत here,

सावधानी: एंड्रॉयड 3.2 (एपीआई स्तर 13), "स्क्रीन आकार" की शुरुआत के साथ भी बदल जाता है जब पोर्ट्रेट और लैंडस्केप उन्मुखीकरण के बीच डिवाइस स्विच। इस प्रकार, यदि आप एपीआई स्तर 13 या उच्चतर ( के रूप में minSdkVersion और targetSdkVersion विशेषताओं द्वारा घोषित किए गए) के रूप में अभिविन्यास परिवर्तन के कारण रनटाइम पुनरारंभ को रोकना चाहते हैं, तो आप में "अभिविन्यास" के अतिरिक्त "स्क्रीनसाइज़" मान शामिल करना होगा मूल्य। यही है, आपको एंड्रॉइड को डीकलेयर करना होगा: configChanges = "ओरिएंटेशन | स्क्रीन साइज"। हालांकि, यदि आपका एप्लिकेशन लक्ष्य API स्तर 12 या उससे कम है, तो आपकी गतिविधि हमेशा इस कॉन्फ़िगरेशन को स्वयं ही संभालती है (यह कॉन्फ़िगरेशन आपकी गतिविधि को पुनरारंभ नहीं करता है, भले ही एंड्रॉइड 3.2 या उच्च डिवाइस पर चल रहा हो)।

आपकी गतिविधि पर android:configChanges="orientation|screenSize" सेटिंग इस समस्या को हल करेगी।

इसके अलावा, निम्नलिखित

को ध्यान में रखना याद रखें: जब आप अपने गतिविधि एक विन्यास परिवर्तन को संभालने के लिए घोषित, आप किसी भी तत्व है जिसके लिए आप विकल्प प्रदान रीसेट करने के लिए जिम्मेदार हैं। यदि आप अभिविन्यास परिवर्तन को संभालने के लिए अपनी गतिविधि की घोषणा करते हैं और परिदृश्य और चित्र के बीच छवियों को बदलना चाहिए, तो आपको प्रत्येक संसाधन को प्रत्येक तत्व पर कॉन्फ़िगरेशन चेंज() के दौरान फिर से असाइन करना होगा।

संबंधित मुद्दे