使用列表组织WebView解决返回页面总是刷新的问题

来源:互联网 发布:ubuntu 如何使用汉语 编辑:程序博客网 时间:2024/06/05 10:47

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    android:id="@+id/root"    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"></RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {    ViewGroup mRootView;    ProgressBar mProgressBar;    List<WebView> mWebViews = new ArrayList<>();    List<String> mUrls = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mRootView = (ViewGroup) findViewById(R.id.root);        mProgressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);        int height = (int) (getResources().getDisplayMetrics().scaledDensity * 3);        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,                height);        mProgressBar.setLayoutParams(layoutParams);        mProgressBar.setProgressDrawable(ContextCompat.getDrawable(this, R.drawable.web_progress));        requestPage("http://www.mingtengnet.cn");    }    /**     * 查看是否浏览过该页面,如果是,移除该页面之后的所有页面并刷新该页面,否则使用新的WebView并入栈。     *     * @param url     */    private void requestPage(String url) {        WebView webView = null;        for (int i = 0; i < mUrls.size(); i++) {            if (mUrls.get(i).equals(url)) {                removePages(i + 1);                webView = mWebViews.get(i);                break;            }        }        if (webView == null) {            webView = generateWebView();            pushPage(webView, url);        }        webView.loadUrl(url);    }    /**     * 新页面入栈。     *     * @param webView     * @param url     */    private void pushPage(WebView webView, String url) {        mUrls.add(url);        mWebViews.add(webView);        mRootView.addView(webView);    }    /**     * 移除最后一个页面,出栈。     */    private void popupPage() {        if (mWebViews.size() > 1) {            WebView webView = mWebViews.get(mWebViews.size() - 1);            webView.stopLoading();            webView.destroy();            mRootView.removeView(webView);            mWebViews.remove(webView);            mUrls.remove(mUrls.size() - 1);        }    }    /**     * 移除指定位置之后的页面     *     * @param startIndex     */    private void removePages(int startIndex) {        for (int i = mWebViews.size() - 1; i >= startIndex; i--) {            popupPage();        }    }    /**     * 生成新的WebView     *     * @return     */    private WebView generateWebView() {        WebView webView = new WebView(MainActivity.this);        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,                RelativeLayout.LayoutParams.MATCH_PARENT);        webView.setLayoutParams(layoutParams);        WebSettings webSettings = webView.getSettings();        webSettings.setJavaScriptEnabled(true);        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//        webSettings.setDomStorageEnabled(true);//        webSettings.setUseWideViewPort(true);//        webSettings.setAllowFileAccess(true);//        webSettings.setLoadWithOverviewMode(true);//        webSettings.setPluginState(WebSettings.PluginState.ON);//        webSettings.setSupportZoom(true);//        webSettings.setMediaPlaybackRequiresUserGesture(true);//        webSettings.setBuiltInZoomControls(true);//        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);        webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);//启用加速,否则滑动界面不流畅        webView.setWebChromeClient(new WebChromeClient() {            @Override            public void onProgressChanged(WebView view, int newProgress) {                mProgressBar.setProgress(newProgress);                if (newProgress == 100) {                    removeProgressBar();                } else {                    if (mProgressBar.getParent() == null) {                        mRootView.addView(mProgressBar);                    }                }                super.onProgressChanged(view, newProgress);            }        });        webView.setWebViewClient(new WebViewClient() {            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                if (url != null && url.startsWith("tel:")) {                    handleTelUrl(url);                } else {                    requestPage(url);                }                return true;            }            @Override            public void onPageFinished(WebView view, String url) {                super.onPageFinished(view, url);                removeProgressBar();            }        });        if (mWebViews.size() > 0) {            webView.setBackgroundColor(0);//解决打开新网页界面短暂空白的问题        }        return webView;    }    private void removeProgressBar() {        if (mProgressBar.getParent() != null) {            mRootView.removeView(mProgressBar);        }    }    private void handleTelUrl(String url) {        Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));        startActivity(intent);    }    @Override    public void onBackPressed() {        if (mWebViews.size() > 1) {            popupPage();        } else {            super.onBackPressed();        }    }}

drawable/web_progress.xml
引用自 http://blog.csdn.net/finddreams/article/details/44172639/

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@android:id/background">    <shape>        <corners android:radius="2dp" />        <gradient            android:angle="270"            android:centerColor="#E3E3E3"            android:endColor="#E6E6E6"            android:startColor="#C8C8C8" />    </shape></item><item android:id="@android:id/progress">    <clip>        <shape>            <corners android:radius="2dp" />            <gradient                android:centerColor="#4AEA2F"                android:endColor="#31CE15"                android:startColor="#5FEC46" />        </shape>    </clip></item></layer-list>
阅读全文
0 0
原创粉丝点击