【问题标题】:WebView attributes like setJavaScriptEnabled,setBuiltInZoomControls etc. are not being saved未保存诸如 setJavaScriptEnabled、setBuiltInZoomControls 等 WebView 属性
【发布时间】:2018-05-30 20:17:28
【问题描述】:

一旦第一次执行 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);
    }
}

【问题讨论】:

    标签: android android-webview


    【解决方案1】:

    restoreState 不可靠,基于documentation for restoreState

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

    基于saveState 的文档:

    请注意,此方法不再存储显示数据 这个网页视图

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

    另一种选择是自己处理方向并保持 WebView 不变。您可以通过在清单中添加 android:configChanges="orientation" 并覆盖 onConfigurationChanged() 来处理方向更改。

    【讨论】:

    • 感谢您的建议 Sagar,但我在 chrome 或任何浏览器上尝试过该网站,我更改了方向但网页没有更改其设置,您认为是什么原因?
    • @CLay 正如我所说的恢复不可靠,在 onCreate 中重新设置设置
    • 就像你的意思再次调用所有方法,如 setBuiltInZoomControls 和所有?它会起作用(我用 setJavaScriptEnabled 尝试过,当我旋转手机时它起作用了),但我想知道属性没有保存在我的 WebView 中并在其他浏览器上工作的原因是什么。还要感谢您让我知道 restoreState 不可靠,请从我的代码中删除它。
    • @CLay 其他浏览器可能会以同样的方式处理它。只是不引人注目。查看此SO 了解更多想法
    • 感谢@Sagar 提供的信息,如果您找到任何相关信息,请分享
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多