web-dev-qa-db-fra.com

Android - Empêcher le rechargement de WebView lors de la rotation

Lorsque je fais pivoter mon écran, WebView recharge la page entière. Je ne peux pas avoir cela car certains de mes contenus contiennent du matériel dynamique/aléatoire. Actuellement, lors de la rotation de l'écran, l'URL d'origine est rechargée à partir de la méthode loadUrl ().

Une idée de ce qui ne va pas avec mon code?

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>
73
mark

Je pense que le principal problème est que vous appelez web.loadUrl (webURL); également lorsque savedInstanceState! = null

EDIT

Essayer:

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

EDIT2: Vous avez également besoin des substitutions onSaveInstanceState et 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);
}

Remarque: veuillez également ajouter votre fichier AndroidManifest.xml dans votre activité Android: configChanges = "orientation | screenSize" Merci

83
Giuseppe

Non Java codage nécessaire. Utilisez-le dans votre fichier manifeste.

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

comme:

<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>
61
Aby Mathew

dans la balise (manifeste)

Android:configChanges="orientation|screenSize"
17
01wifi01

Ajouter Android:configChanges="orientation|screenSize" dans les œuvres manifestes pour moi

<activity
            Android:name="com.example.HelloWorld.WebActivity"
            Android:label="@string/title_activity_web"
            Android:configChanges="orientation|screenSize" >
</activity>
14
Abu Mohammad Rasel

Je ne crois pas que cela fonctionnera plus. Dans mon cas, la restauration de l'état à l'aide de WebView.restore(Bundle savedInstanceState) déclenche toujours un rechargement de l'URL.

En regardant docs pour restoreState(), vous verrez qu'il est écrit:

Si elle est appelée après que cette WebView ait eu la possibilité de créer un état (chargement de pages, création d'une liste de renvoi/renvoi, etc.), il peut en résulter des effets secondaires indésirables.

et

Veuillez noter que cette méthode ne restaure plus les données d'affichage pour cette WebView.

Props à @ e4c5 pour m'avoir orienté dans la bonne direction dans son réponse

Et bien sûr, la solution extrême serait d'empêcher les changements d'orientation de déclencher la destruction/création d'activités. La documentation pour savoir comment faire ceci est ici

7
Ranjeev Mahtani

Ajouter ce code dans le manifeste

<activity 
     ...
     Android:configChanges="orientation|screenSize">
5
Confuse

Placez ceci dans l'activité du fichier Manifest.xml:

Android:configChanges="orientation|screenSize"

Voici un exemple:

<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>

Essayez ceci dans votre fichier manifeste:

Android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
4
Ajeet Yadav

Comme cité ici ,

Attention: À partir de Android 3.2 (API, niveau 13), la "taille de l'écran" change également lorsque le périphérique bascule entre l'orientation portrait et l'orientation paysage. Ainsi, si vous souhaitez empêcher les redémarrages de l'exécution à cause de l'orientation change lors du développement pour l'API de niveau 13 ou supérieur (comme indiqué par les attributs minSdkVersion et targetSdkVersion), vous devez inclure la valeur "screenSize" en plus de la valeur "orientation", c'est-à-dire que vous devez transférer Android: configChanges = "orientation | screenSize ". Toutefois, si votre application cible une API de niveau 12 ou inférieur, votre activité gère toujours cette modification de configuration elle-même (cette modification de configuration ne redémarre pas votre activité, même si elle est exécutée sur un Android 3.2 ou périphérique supérieur).

réglage Android:configChanges="orientation|screenSize" sur votre activité va résoudre ce problème.

Prenez également note de ce qui suit

N'oubliez pas: lorsque vous déclarez que votre activité doit gérer un changement de configuration, vous êtes responsable de la réinitialisation des éléments pour lesquels vous fournissez des alternatives. Si vous déclarez que votre activité gère le changement d'orientation et que les images doivent basculer entre paysage et portrait, vous devez réaffecter chaque ressource à chaque élément pendant onConfigurationChanged ().

4
davejoem

Remplacez la méthode onConfigChange pour éviter de recharger les données lors du changement d'orientation

sur votre activité dans le fichier AndroidMainfest.

Android:configChanges="orientation|keyboardHidden" 

et les avoir aussi dans vos paramètres WebView

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

Cette solution fonctionne bien pour moi:

(1) Dans AndroidManifest.xml, ajoutez cette ligne Android: configChanges = "keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize"

Comme ça (et comme les réponses ci-dessus)

<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) Puis dans MainActivity.Java, vérifiez SavedInstanceState.

@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) et ensuite:

@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);
}
3
Adrian S.