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>
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
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>
dans la balise (manifeste)
Android:configChanges="orientation|screenSize"
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>
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
Ajouter ce code dans le manifeste
<activity
...
Android:configChanges="orientation|screenSize">
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"
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 ().
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");
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);
}