103 votes

Android - Empêcher le rechargement d'un WebView lors d'une rotation

Lorsque je fais pivoter mon écran, le WebView recharge la page entière. Je ne peux pas faire cela car une partie de mon contenu contient des éléments dynamiques/aléatoires. Actuellement, lorsqu'il est tourné, l'écran recharge l'URL d'origine à partir de la méthode loadUrl().

Une idée de ce qui ne va pas dans 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>

7voto

Neutrino Points 545

Ajouter ce code dans Manifest

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

5voto

Ajeet yadav Points 159

Essayez ceci dans votre fichier manifeste :

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

5voto

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>

4voto

Sampath Kumar Points 577

Remplacer le onConfigChange pour éviter de recharger les données lors d'un changement d'orientation

sur votre activité dans AndroidMainfest archivo.

android:configChanges="orientation|keyboardHidden" 

et ajoutez les éléments suivants dans les paramètres de votre WebView

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

4voto

davejoem Points 720

Comme cité aquí ,

Attention : À partir de la version 3.2 d'Android (niveau 13 de l'API), la "taille de l'écran" change également. change également lorsque l'appareil passe de l'orientation portrait à l'orientation paysage. et paysage. Par conséquent, si vous voulez éviter les redémarrages de l'exécution en raison du changement d'orientation lorsque vous développez pour le niveau API 13 ou plus (comme supérieur (tel que déclaré par les attributs minSdkVersion et targetSdkVersion), vous devez inclure la valeur "screenSize" en plus de la valeur "orientation". en plus de la valeur "orientation". En d'autres termes, vous devez décalquer Android:configChanges="orientation|screenSize". Toutefois, si votre application vise le niveau 12 de l'API ou un niveau inférieur, alors votre activité gère elle-même ce changement de configuration (ce changement de configuration configuration ne redémarre pas votre activité, même lorsqu'elle fonctionne sur un appareil Android 3.2 ou supérieur).

paramètre android:configChanges="orientation|screenSize" sur votre activité résoudra ce problème.

Prenez également note des points suivants

Souvenez-vous : Lorsque vous déclarez votre activité pour gérer une configuration vous êtes responsable de la réinitialisation de tous les éléments pour lesquels vous avez effectué un changement de configuration. fournissez des alternatives. Si vous déclarez votre activité pour gérer le changement d'orientation et que vous avez des images qui doivent changer entre paysage et portrait, vous devez réaffecter chaque ressource à chaque élément élément pendant onConfigurationChanged().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X