WebView属性(如setJavaScriptEnabled,setBuiltInZoomControls等)未保存

时间:2018-05-30 20:17:28

标签: android android-webview

首次执行onCreate()方法时会启用这些功能,但在我进行屏幕旋转后,即使我已经覆盖了onSaveInstanceState()方法,也没有任何功能被保存,我也是尝试使用onRestoreInstanceState()方法。 请帮助我。

我会附上以下代码。 活动文件

import android.app.LoaderManager;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.Loader;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.webkit.CookieManager;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class Main3Activity extends AppCompatActivity implements LoaderManager.LoaderCallbacks{

    Toolbar toolbar;
    WebView webView;
    ProgressDialog progressDialog;
    final String urld="https://www.google.co.in/";
    final int LOADER_ID=1;
    Bundle bundle;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);

        }
        webView = (WebView)findViewById(R.id.wb1);

        progressDialog = new ProgressDialog(Main3Activity.this);
        progressDialog.setTitle("Loading");
        progressDialog.setIndeterminate(true);
        progressDialog.setMessage("Please Wait...");
        progressDialog.setCancelable(true);
        if(savedInstanceState!=null)
        {
            webView.restoreState(savedInstanceState);
            webView.getSettings().setJavaScriptEnabled(true);
        }
        else {
            webView.getSettings().setJavaScriptEnabled(true);
            webView.setFocusable(true);
            webView.setFocusableInTouchMode(true);
            //webView.getSettings().setSupportZoom(true);
            webView.getSettings().setBuiltInZoomControls(true);
            webView.getSettings().setDisplayZoomControls(true);
            webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
            //webView.setInitialScale(1);
            webView.getSettings().setLoadWithOverviewMode(true);
            webView.getSettings().setUseWideViewPort(true);
            webView.setBackgroundColor(Color.WHITE);
            //webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
            webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
            webView.getSettings().setDomStorageEnabled(true);
            //webView.getSettings().setDatabaseEnabled(true);
            webView.getSettings().setAppCacheEnabled(true);
            //webView.setWebChromeClient(new WebChromeClient());
            if (Build.VERSION.SDK_INT >= 19) {
                webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
            } else {
                webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            }

            webView.setWebViewClient(new WebViewClient() {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {

                    /*if( URLUtil.isNetworkUrl(url) ) {
                        return false;
                    }
                    if (appInstalledOrNot(url)) {
                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                        startActivity( intent );
                    } else {
                        // do something if app is not installed
                    }
                    return true;*/
                    if (Uri.parse(url).getHost().endsWith("google.co.in")) {
                        return false;
                    }

                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    view.getContext().startActivity(intent);
                    CookieManager.getInstance().setAcceptCookie(true);
                    return true;

                }

                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    progressDialog.show();
                    super.onPageStarted(view, url, favicon);
                }

                @Override
                public void onPageFinished(WebView view, String url) {
                    progressDialog.dismiss();
                    super.onPageFinished(view, url);
                }
            });
        }

            bundle = savedInstanceState;

            LoaderManager loaderManager = getLoaderManager();

            // Initialize the loader. Pass in the int ID constant defined above and pass in null for
            // the bundle. Pass in this activity for the LoaderCallbacks parameter (which is valid
            // because this activity implements the LoaderCallbacks interface).
            loaderManager.initLoader(LOADER_ID, null, this);
    }
    /*private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
        }

        return false;
    }*/

    @Override
    public void onBackPressed() {
        if(webView.canGoBack())
        {
            webView.goBack();
        }
        else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // handle arrow click here
        if (item.getItemId() == android.R.id.home) {
            finish(); // close this activity and return to preview activity (if there is any)
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public Loader onCreateLoader(int i, Bundle bundle) {

        return new LoadingPageInBackground(this,urld,bundle,webView,progressDialog);
    }

    @Override
    public void onLoadFinished(Loader loader, Object o) {

    }

    @Override
    public void onLoaderReset(Loader loader) {
        //webView.setVisibility(WebView.GONE);
    }


    @Override
    protected void onSaveInstanceState(Bundle outState) {
        webView.saveState(outState);
        Toast.makeText(Main3Activity.this,"Saved",Toast.LENGTH_SHORT).show();
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle state) {
        webView.restoreState(state);
        Toast.makeText(Main3Activity.this,"Restored",Toast.LENGTH_SHORT).show();
        super.onRestoreInstanceState(state);
    }
}

1 个答案:

答案 0 :(得分:0)

根据{{​​1}}的{​​{3}},

restoreState不可靠:

  

如果在此WebView有机会构建状态后调用它   (可能有加载页面,创建后退/前进列表等)   不良副作用。请注意,这种方法不再   恢复此WebView的显示数据。

基于documentation的文档:

  

请注意,此方法不再存储显示数据   这个WebView

您必须在onCreate()中重新加载WebView。您可以将URL存储在SharedPreference中并将其加载到onCreate()。

另一种方法是自己处理Orientation并保持WebView不变。您可以在清单中添加restoreState并覆盖android:configChanges="orientation"来处理方向更改。