Android - रोटेट पर WebView रीलोड को रोकना


90

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

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

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>

1
सरलीकृत समाधान जो मैंने खुद इस्तेमाल किया था और यहाँ सुझा सकता है: twigstechtips.blogspot.com/2013/08/…
एंड्रियस बरकिस

जवाबों:


103

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

संपादित करें

प्रयत्न:

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);
}

नोट: कृपया अपनी गतिविधि Android में अपने AndroidManifest.xml में भी जोड़ें: configChanges = "अभिविन्यास। स्क्रीन पर क्लिक करें" धन्यवाद


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


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

21
यह एक ही पृष्ठ रखता है, लेकिन फिर भी स्क्रीन रोटेट पर पुनः लोड होता है
ग्रासपर

2
यह काम करता है अगर मैं एंड्रॉइड जोड़ता हूं: AndroidManifest में <गतिविधि> के लिए संपत्ति कॉन्फ़िगर करता है, तो आपके उत्तर से दो चीजें प्लस एक। यहाँ एक बेहतर उत्तर है जिसमें तीनों चीजें शामिल हैं: stackoverflow.com/a/46849736/454780
trusktr

63

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

 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
आप किन बदलावों की बात कर रहे हैं?
प्रतीक पोद्दार

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

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

6
@EricCochran क्या आप सही उत्तर लिख सकते हैं, यदि आप एक जानते हैं? स्वीकृत उत्तर अभी भी मेरे लिए पृष्ठ को पुनः लोड करता है, यह सत्र जानकारी भी खो देता है। मेरे मामले में जो वाह की तरह है, आप फोन चालू करते हैं - आपको फिर से लॉगिन करना होगा।
एटमोसक

यह केवल एक पूर्ण उत्तर का हिस्सा हो सकता है। इसे बेहतर देखें: stackoverflow.com/a/46849736/454780
trusktr

19

टैग में (प्रकट)

android:configChanges="orientation|screenSize"

8
वास्तव में onConfigurationChangedविधि को ओवरराइड करने का कोई कारण नहीं है क्योंकि कोई कस्टम कार्यक्षमता नहीं जोड़ी गई है। बस मैनिफ़ेस्ट फ़ाइल में परिवर्तन करके मेरे लिए चाल चली।
i9797i

मैनिफ़ेस्ट पर्याप्त था, और केवल जोड़ने के लिए upvoteorientation|screenSize
वरुण गर्ग

14

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

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

क्या आप पोस्ट कर सकते हैं कि आपकी MainActivity WebView के बारे में क्या करती है?
त्रिकूट

8

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

को देखते हुए डॉक्स के लिए restoreState()आप इसे कहते हैं यह दिखाई देगा:

यदि यह कहा जाता है कि इस WebView को राज्य बनाने का मौका मिला है (लोड पेज, बैक / फॉरवर्ड लिस्ट, आदि बनाएं) अवांछनीय दुष्प्रभाव हो सकते हैं।

तथा

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

उसके उत्तर में मुझे सही दिशा में इंगित करने के लिए @ e4c5 पर जाता है

और निश्चित रूप से, कार्रवाई का चरम पाठ्यक्रम गतिविधि परिवर्तन / निर्माण को ट्रिगर करने से अभिविन्यास परिवर्तन को रोकने के लिए होगा। ऐसा करने के लिए प्रलेखन यहाँ है


6

इस कोड को मेनिफेस्ट में जोड़ें

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

4

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="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

4

इसे 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>

4

यहाँ उद्धृत किया गया है ,

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

स्थापना android:configChanges="orientation|screenSize"अपनी गतिविधि पर करने से यह समस्या हल हो जाएगी।

इसके अलावा, निम्नलिखित पर ध्यान दें

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


3

यह समाधान मेरे लिए अच्छा काम करता है:

(1) AndroidManifest.xml में इस लाइन को जोड़ें android: configChanges = "कीबोर्ड | कीबोर्डहेड | कीबोर्ड ओरिएंटेशन | स्क्रीनलैट | uiMode | screenSize | smallestScreenSize"

इस तरह (और उपरोक्त उत्तरों की तरह)

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

(2) उसके बाद MainActivity.java में सेवइन्स्टैंसस्टेट को सत्यापित करें

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mainContext = getApplicationContext();
    ----
    myWebView = (WebView) findViewById(R.id.webView);
    prepareWebView();
    myWebView.addJavascriptInterface(myJavaScriptInterface, "WEB2Android");

    if (savedInstanceState == null) {
        myWebView.post(new Runnable() {
            @Override
            public void run() {
                myWebView.loadUrl("http://www.appbiz.ro/foto_konta");
            }
        });
    }
    ----
}

(3) और फिर:

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

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

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
    super.onRestoreInstanceState(savedInstanceState);
    myWebView.restoreState(savedInstanceState);
}

0

Androidmanifest.xml में इसे जोड़ें:

<activity android:name=".MyActivity"
    android:configChanges="orientation|screenSize|screenLayout|keyboardHidden">

अब, जब इनमें से एक कॉन्फ़िगरेशन बदलता है, MyActivityतो पुनरारंभ नहीं होता है। इसके बजाय, MyActivityएक कॉल प्राप्त करता है onConfigurationChanged()

इसे जोड़ो:

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.