Android-предотвращение перезагрузки WebView при вращении
когда я поворачиваю экран, WebView перезагружает всю страницу. Я не могу этого сделать, так как некоторые из моих материалов содержат динамический/случайный материал. В настоящее время при повороте экран перезагружает исходный URL-адрес из метода loadUrl ().
есть идеи, что случилось с моим кодом?
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>
11 ответов:
Я думаю, что основная проблема заключается в том, что вы называете web.loadUrl (webURL); также при savedInstanceState != null
EDIT
попробуй:
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); }
не требуется кодирование java. используйте это в файле манифеста.
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>
в теге (манифест)
android:configChanges="orientation|screenSize"в классе
@Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); }
добавлять
android:configChanges="orientation|screenSize"в манифесте работает для меня<activity android:name="com.example.HelloWorld.WebActivity" android:label="@string/title_activity_web" android:configChanges="orientation|screenSize" > </activity>
Я не верю, что это будет работать. В моем случае восстановление состояния с помощью
WebView.restore(Bundle savedInstanceState)по-прежнему вызывает перезагрузку url.смотреть на!--5-- > docs на
restoreState()вы увидите, что он говорит:если он вызывается после того, как этот WebView имел возможность построить состояние (загрузить страницы, создать список назад / вперед и т. д.) могут быть нежелательные побочные эффекты.
и
обратите внимание, что этот метод больше не восстанавливает данные отображения для этого веб-представления.
реквизит к @e4c5 для указания мне в правильном направлении в его ответ
и, конечно же, крайний курс действий состоял бы в том, чтобы предотвратить изменения ориентации от запуска разрушения/создания активности. Документация для того, как это сделать здесь
цитата здесь,
внимание: начиная с Android 3.2 (уровень API 13), "Размер экрана " также изменяется при переключении устройства между книжной и альбомной ориентацией ориентация. Таким образом, если вы хотите предотвратить перезапуск среды выполнения из-за изменение ориентации при разработке для API уровня 13 или выше (как объявленные атрибутами minSdkVersion и targetSdkVersion), вы необходимо включить значение" screenSize "в дополнение к" ориентация" значение. То есть, вы должны decalare android: configChanges= "ориентация / screenSize". Однако, если ваш приложение нацелено на уровень API 12 или ниже, тогда ваша активность всегда обрабатывает это изменение конфигурации сам (это изменение конфигурации не перезапускает вашу деятельность, даже при работе на Android 3.2 или высшее устройство).
задание
android:configChanges="orientation|screenSize"на вашей деятельности будет решить эту проблему.кроме того, обратите внимание на следующее
помните: При объявлении действия для обработки конфигурации изменение, вы несете ответственность за сброс любых элементов, для которых вы обеспечьте альтернативы. Если вы объявите свою деятельность для обработки изменение ориентации и иметь изображения, которые должны меняться между пейзаж и портрет, вы должны повторно назначить каждый ресурс для каждого элемент в onConfigurationChanged().
переопределить
onConfigChangeметод, чтобы избежать перезагрузки данных при изменении ориентациио вашей деятельности в .
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");
попробуйте это в файле манифеста:
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
поместите это в манифест.активность 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) В AndroidManifest.XML-файле добавьте следующую строку android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|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 verify 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) а затем:
@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); }
Comments