android:webView处理方向更改

时间:2015-09-04 13:10:21

标签: android webview screen-orientation android-orientation

我想阻止webview在每次更改方向时重新加载页面。

我已按照以下教程进行操作:

http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change

但它调用onCreate()方法eveytime并再次获取页面agin。

DisplayResult.java:

public class DisplayResult extends AppCompatActivity
{
protected FrameLayout webViewPlaceholder;


protected WebView webView;
protected Uri url;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.display_result);
    url = Uri.parse(getIntent().getStringExtra("Url"));
    initUI();
    Toast.makeText(DisplayResult.this ,"Oncreate",Toast.LENGTH_SHORT).show();
}


protected void initUI()
{
    webViewPlaceholder =(FrameLayout)findViewById(R.id.webViewPlaceholder);
    if(webView==null)
    {

        //webView = (WebView) findViewById(R.id.webview);
        webView = new WebView(this);
        // webView.getSettings().setLoadWithOverviewMode(true);
        webView.getSettings().setUseWideViewPort(true);
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setDisplayZoomControls(false);
        //webView.getSettings().setTextZoom(0);
        webView.setWebViewClient(new Callback());
        webView.loadUrl(url.toString());

    }
    webViewPlaceholder.addView(webView);
}

private class Callback extends WebViewClient {
    MaterialDialog m ;

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return(false);
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap facIcon) {

        m=new MaterialDialog.Builder(DisplayResult.this)
                .title("Fetching Result")
                .content("Please wait...")
                .progress(true,0)

                .show();
    }
    @Override
    public void onPageFinished(WebView view, String url){
        m.cancel();
    }
}

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

    webView.saveState(outState);
}

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

@Override
public void onConfigurationChanged(Configuration newConfig){
    if(webView==null)
    {
        webViewPlaceholder.removeView(webView);
    }
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.display_result);
    url = Uri.parse(getIntent().getStringExtra("Url"));
    initUI();
}

}

和我的布局文件:

<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout
    android:id="@+id/webViewPlaceholder"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"></FrameLayout>

</LinearLayout>

我还在清单文件中添加了:

<activity
        android:name=".DisplayResult"
        android:configChanges="keyboard|keyboardHidden|orientation"
        android:label="@string/display"
        android:parentActivityName=".MainActivity" />

仍然无法正常工作。任何人都可以帮我解决问题:

我也尝试过:

Android Webview Handling Orientation Not Working

2 个答案:

答案 0 :(得分:3)

您尚未将screenSize添加到configChanges

来自Android Docs

  

某些设备配置可能会在运行时更改(例如屏幕方向,键盘可用性和语言)。发生此类更改时,Android会重新启动正在运行的活动(onDestroy()被调用,然后是onCreate())。重新启动行为旨在通过使用与新设备配置匹配的备用资源自动重新加载应用程序来帮助您的应用程序适应新配置。

  

警告:从Android 3.2(API级别13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,如果要在开发API级别13或更高级别(由minSdkVersion和targetSdkVersion属性声明)时由于方向更改而阻止运行时重新启动,则除了“orientation”值之外,还必须包含“screenSize”值。也就是说,您必须声明android:configChanges="orientation|screenSize。但是,如果您的应用程序的目标是API级别12或更低,那么您的活动始终会自行处理此配置更改(即使在Android 3.2或更高版本的设备上运行,此配置更改也不会重新启动您的活动。)

考虑到这一点,为了防止每次更改方向时调用onCreate(),您必须将android:configChanges="orientation|screenSize"添加到AndroidManifest。

答案 1 :(得分:1)

@Override
public void onConfigurationChanged(Configuration newConfig){
if(webView==null)
{
    webViewPlaceholder.removeView(webView);
}
super.onConfigurationChanged(newConfig);
setContentView(R.layout.display_result);
url = Uri.parse(getIntent().getStringExtra("Url"));
initUI();
}

将其替换为

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