最近做一个Android项目所有页面全部是h5,返回时不希望刷新页面,首页,团队,收益,我的 ,是在一个html里面 在浏览器中打开如下图所示:
期望是:点“我的”再点“设置”,进入设置页面,然后点返回,应该停留在“我的”
我通过webview.goback()方法进行返回
实际结果是:却停留在“首页”位置:
(1)点“我的”:
(2)点“设置”:
(3)点“返回”:
通过在网上一番查找,原来webview.goback()会从新刷新页面,所以会停留在“首页”位置
通过下面的方法可以解决这一问题:
1.在布局里添加一个容器:
<FrameLayout
android:id="@+id/framelayout_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
2.然后java动态生成WebView,并且添加进去就可以了:
public class MainActivity extends AppCompatActivity {
private FrameLayout contentPanel;
private List<String> urlList = new ArrayList<>();
private int childCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentPanel = findViewById(R.id.framelayout_main);
addWeb(url);
}
/**
* 添加webview
*
* @param url
*/
private void addWeb(String url) {
WebView mWeb = new WebView(MainActivity.this);
mWeb.getSettings().setJavaScriptEnabled(true);
mWeb.getSettings().setDomStorageEnabled(true);//开启dom缓存就好了,显示弹框
mWeb.setWebChromeClient(new WebChromeClient());
mWeb.setWebViewClient(new MyWebViewClient());
mWeb.loadUrl(url);
contentPanel.addView(mWeb);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
);
mWeb.setLayoutParams(params);
}
//截获跳转
private class MyWebViewClient extends WebViewClient{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(TAG, "shouldOverrideUrlLoading: " + url);
if (!urlList.contains(url)) {
addWeb(url);
urlList.add(url);
return true;
} else {
return super.shouldOverrideUrlLoading(view, url);
}
}
}
//返回处理,和传统的mWeb.canGoBack()不一样了,而是直接remove
@Override
public void onBackPressed() {
childCount = contentPanel.getChildCount();
if (childCount > 1) {
contentPanel.removeViewAt(childCount - 1);
urlList.remove(urlList.size() - 1);
} else {
super.onBackPressed();
}
}
}