2

This is my first app, it is a web app, it simply loads a webView to a url where stuff happens.

It works fine in android browser(gingerbread), but in Chrome(ICS, JB) it was going back to the initial webView url when the device is rotated. In gingerbread you account for this by setting android:configChanges="keyboard|keyboardHidden|orientation" and overriding onConfigurationChanged.

After searching the web, I re-wrote my original activity as per the example here: http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/ , in which you essentially handle the re-orientation yourself.

However now my app is crashing when I rotate the device.

Testing with Android 4.1.2.

Anyone see anything off with my code? Sorry if the answer is obvious, but I've been stuck on this bug for a couple of days now. Maybe I just need another set of eyes on it. Thanks in advance!

Note: the line @SuppressWarnings("deprecation") is not in the example, it was suggested by the editor in order to compile.

The Main Activity:

package com.example.xxx.xxx;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.content.res.Configuration;
import android.view.Menu;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {

protected FrameLayout webViewPlaceholder;
protected WebView myWebView;

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

    initUI();

}

   @SuppressWarnings("deprecation")
   protected void initUI() {

    webViewPlaceholder = ((FrameLayout)findViewById(R.id.webViewPlaceholder));


    if (myWebView == null){
        //Create It
        myWebView = new WebView(this);
        myWebView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setSupportZoom(true);
        webSettings.setBuiltInZoomControls(true);
        webSettings.setLoadsImagesAutomatically(true);
        myWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        myWebView.setScrollbarFadingEnabled(true);
        myWebView.setWebViewClient(new WebViewClient());
        myWebView.setWebChromeClient(new WebChromeClient());
        myWebView.setInitialScale(1);
        myWebView.loadUrl("http://www.theurl.com");

    }

    webViewPlaceholder.addView(myWebView);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

@Override
public void onConfigurationChanged(Configuration newConfig){   

    if (myWebView != null) {

        webViewPlaceholder.removeView(myWebView);

    }

    super.onConfigurationChanged(newConfig);

    setContentView(R.layout.activity_main);

    initUI();

}


@Override
protected void onSaveInstanceState(Bundle outState)
      {
        super.onSaveInstanceState(outState);

        // Save the state of the WebView
        myWebView.saveState(outState);
      }


@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
      {
        super.onRestoreInstanceState(savedInstanceState);

        // Restore the state of the WebView
        myWebView.restoreState(savedInstanceState);
      }
}

Main Activity XML:

<LinearLayout 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" 
    android:orientation="horizontal" >

<FrameLayout android:id="@+id/webViewPlaceholder"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

</LinearLayout>
4

2 に答える 2

1

次のように、マニフェスト ファイルのアクティビティ定義にオリエンテーションを追加してみてください。

<activity android:screenOrientation="portrait"  ...>
</activity>
于 2012-11-14T20:43:38.900 に答える
0

WebChromeClientの機能を使用していなければ、WebChromeClientはまったく必要ないことに気づきました。ここで答えが見つかりました:画面の回転時にWebViewが自動更新されないようにする方法

マニフェストのconfigchangesに「screenSize」を追加するだけです。

android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
于 2012-11-15T16:01:41.117 に答える