2

这是我的第一个应用程序,它是一个网络应用程序,它只是将 webView 加载到发生事情的 url。

它在 android 浏览器(姜饼)中运行良好,但在 Chrome(ICS,JB)中,当设备旋转时,它会返回到初始 webView url。在姜饼中,您可以通过设置 android:configChanges="keyboard|keyboardHidden|orientation" 并覆盖 onConfigurationChanged 来解决此问题。

在网上搜索后,我按照此处的示例重新编写了我的原始活动:http: //www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on- screen-orientation-change/,您基本上可以自己处理重新定向。

但是现在当我旋转设备时我的应用程序崩溃了。

使用 Android 4.1.2 进行测试。

有人看到我的代码有什么问题吗?对不起,如果答案很明显,但我已经被这个错误困住了几天了。也许我只需要另一双眼睛。提前致谢!

注意:@SuppressWarnings("deprecation") 行不在示例中,这是编辑器建议的,以便编译。

主要活动:

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);
      }
}

主要活动 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。在这里找到答案:How to prevent WebView auto refresh when screen rotation

只需将“screenSize”添加到清单中的配置更改中。

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