Как исправить ротацию на webview для телефонов Android? - PullRequest
2 голосов
/ 27 декабря 2011

Я пытаюсь выяснить, как исправить проблему с ориентацией в веб-просмотре.Обычно каждый раз, когда пользователь меняет ориентацию на устройстве, программа становится белой и перезагружает всю страницу.Это займет много времени.

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

Вот мой текущий код.

package testdev.HelloWebApp;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class HelloWebAppActivity extends Activity {
/** Called when the activity is first created. */
private WebView webView;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    webView = (WebView)findViewById(R.id.webView);
    WebSettings webSettings =webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webView.setWebViewClient (new HelloWebViewClient());
    webView.loadUrl("http://google.com");

    if (savedInstanceState != null)
      ((WebView)findViewById(R.id.webView)).restoreState(savedInstanceState);

}
private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack())
    {
        webView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

@Override
protected void onSaveInstanceState(Bundle outState ){
    ((WebView) findViewById(R.id.webView)).saveState(outState);
}
}

Ответы [ 4 ]

7 голосов
/ 10 августа 2012

Начиная с Android 3.2 (уровень API 13), «размер экрана» также изменяется, когда устройство переключается между книжной и альбомной ориентацией. Таким образом, если вы хотите предотвратить перезапуск среды выполнения из-за изменения ориентации при разработке для API уровня 13 или выше (как заявлено атрибутами minSdkVersion и targetSdkVersion), вы должны включить значение «screenSize» в дополнение к значению «direction». То есть вы должны декаляр

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

Вот документы: http://developer.android.com/guide/topics/resources/runtime-changes.html

4 голосов
/ 27 июля 2012

У меня была такая же проблема. Причина, по которой webView перезапускается при переворачивании экрана (по крайней мере, в моем случае), заключается в том, что вы всегда инициализируете webView при запуске onCreate (), даже если webView не имеет значение null.

Сначала добавьте в свой AndroidManifest.xml следующее:

<activity android:configChanges="orientation">

Затем попробуйте добавить условие if:

...

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //Add this
    if(webView == null){
        webView = (WebView)findViewById(R.id.webView);
        WebSettings webSettings =webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.setWebViewClient (new HelloWebViewClient());
        webView.loadUrl("http://google.com");
    }

    if (savedInstanceState != null)
        ((WebView)findViewById(R.id.webView)).restoreState(savedInstanceState);
}

...
1 голос
/ 15 сентября 2015

Это 2015 год, и многие люди ищут решение, которое все еще работает на телефонах Jellybean, KK и Lollipop.После значительных попыток я нашел способ сохранить целостность веб-просмотра после изменения ориентации.Моя стратегия заключается в том, чтобы хранить веб-представление в отдельной статической переменной в другом классе.Затем, если происходит ротация, я отсоединяю веб-представление от действия, ожидаю завершения ориентации и снова присоединяю веб-представление к действию.Например ... сначала поместите это в манифест (клавиатура скрыта и клавиатура необязательны):

<application
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name="com.myapp.abc.app">

    <activity
            android:name=".myRotatingActivity"
            android:configChanges="keyboard|keyboardHidden|orientation">
    </activity>

В ОТДЕЛЬНОМ КЛАССЕ ПРИЛОЖЕНИЯ введите:

     public class app extends Application {
            public static WebView webview;
            public static FrameLayout webviewPlaceholder;//will hold the webview

         @Override
               public void onCreate() {
                   super.onCreate();
    //dont forget to put this on the manifest in order for this onCreate method to fire when the app starts: android:name="com.myapp.abc.app"
                   setFirstLaunch("true");
           }

       public static String isFirstLaunch(Context appContext, String s) {
           try {
          SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
          return prefs.getString("booting", "false");
          }catch (Exception e) {
             return "false";
          }
        }

    public static void setFirstLaunch(Context aContext,String s) {
       SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(aContext);
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString("booting", s);
            editor.commit();
           }
        }

В поле ACTIVITY поместите:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(app.isFirstLaunch.equals("true"))) {
            app.setFirstLaunch("false");
            app.webview = new WebView(thisActivity);
            initWebUI("www.mypage.url");
        }
}
@Override
    public  void onRestoreInstanceState(Bundle savedInstanceState) {
        restoreWebview();
    }

public void restoreWebview(){
        app.webviewPlaceholder = (FrameLayout)thisActivity.findViewById(R.id.webviewplaceholder);
        if(app.webviewPlaceholder.getParent()!=null&&((ViewGroup)app.webview.getParent())!=null) {
            ((ViewGroup) app.webview.getParent()).removeView(app.webview);
        }
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT);
        app.webview.setLayoutParams(params);
        app.webviewPlaceholder.addView(app.webview);
        app.needToRestoreWebview=false;
    }

protected static void initWebUI(String url){
        if(app.webviewPlaceholder==null);
          app.webviewPlaceholder = (FrameLayout)thisActivity.findViewById(R.id.webviewplaceholder);
        app.webview.getSettings().setJavaScriptEnabled(true);       app.webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        app.webview.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
        app.webview.getSettings().setSupportZoom(false);
        app.webview.getSettings().setBuiltInZoomControls(true);
        app.webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        app.webview.setScrollbarFadingEnabled(true);
        app.webview.getSettings().setLoadsImagesAutomatically(true);
        app.webview.loadUrl(url);
        app.webview.setWebViewClient(new WebViewClient());
        if((app.webview.getParent()!=null)){//&&(app.getBooting(thisActivity).equals("true"))) {
            ((ViewGroup) app.webview.getParent()).removeView(app.webview);
        }
        app.webviewPlaceholder.addView(app.webview);
    }

Наконец, простой XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".myRotatingActivity">
    <FrameLayout
        android:id="@+id/webviewplaceholder"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</RelativeLayout>

Есть несколько вещей, которые можно улучшить в моем решении, но я уже потратил много времени, например: более короткий путьпроверить, была ли активность запущена в первый раз вместо использования хранилища SharedPreferences.Этот подход сохраняет веб-просмотр без изменений (afaik), его текстовые поля, метки, пользовательский интерфейс, переменные javascript и состояния навигации, которые не отражаются в URL.

1 голос
/ 27 декабря 2011

При повороте устройства Android перезапускает приложение , чтобы помочь перезагрузить нужные файлы конфигурации.Есть несколько способов справиться с этим.Основными из них являются сохранение состояния приложения и его перезагрузка после изменения конфигурации или указание Android не сбрасывать приложение при определенных изменениях ориентации.Для вашей ситуации я бы порекомендовал последнее (потому что я мало работал с WebView). Вот как.

Добавьте это в манифест активности (й), который вы не хотите перезапускать.

android: configChanges =" direction ">

И если вы хотите выполнить какой-либо код при изменении конфигурации, добавьте его в код своей деятельности.

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Do something here
}
...