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

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 для указания мне в правильном направлении в его ответ

и, конечно же, крайний курс действий состоял бы в том, чтобы предотвратить изменения ориентации от запуска разрушения/создания активности. Документация для того, как это сделать здесь

добавить этот код в Манифесте

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

цитата здесь,

внимание: начиная с 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

    Ничего не найдено.