开发的时候遇到一个难题,ScrollView嵌套里的Linearlayout有webveiw,RelativeLayout和listview,方向为垂直,里面的listview重写高度就可以,重点是webview,高度死活不对,给了js方法,没用,这个bug愣是拖了一个星期,后面还是大佬指导才解决的,特此留个笔记分享。
1、效果图:
2、bug图:
3、明显是高度问题,网上看了各个大神的博客,没找到我需要的,最后还是请教的大佬,方法如下:
public class MyWebView extends WebView {
public MyWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyWebView(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//报错不用管,运行不会出错的(2018.7.30)
int height=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >>0,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, height);
}
private OnScrollChangeListener mOnScrollChangeListener;
public void setOnScrollChangeListener(OnScrollChangeListener listener) {
this.mOnScrollChangeListener = listener;
}
}
4.使用(这里使用了NestedScrollview,webview的高度一定要设置伟wrap_content,不然底部会出现一大片空白,因为在MyWebView的onMeasure里用的模式是按照最大值来的):
<android.support.v4.widget.NestedScrollView
android:fillViewport="true"
android:id="@+id/scroll_view"
android:layout_below="@id/web_include"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.administrator.baiding.Activity.View.MyWebView
android:id="@+id/wev_activity"
android:clickable="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:visibility="gone"
android:id="@+id/include_view"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<include layout="@layout/item_web_four" />
</LinearLayout>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
5、java代码的设置:
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview_and_four);
if (Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
ButterKnife.bind(this);
Glide.with(this).load(R.drawable.pic_gif).into(ivGif);
set();
}
//setting的配置以及适应各种弹出框
@SuppressLint("JavascriptInterface")
private void set() {
WebSettings webSettings = webActivity.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSettings.setLoadsImagesAutomatically(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setAllowFileAccess(true);
webSettings.setSupportZoom(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDefaultTextEncodingName("utf-8");
webSettings.setUseWideViewPort(true);
webActivity.addJavascriptInterface(this, "Resize");
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);// 支持内容重新布局
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
webActivity.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Glide.with(WebViewActivity.this).load(R.drawable.pic_gif).into(ivGif);
return false;
}
@Override
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
super.doUpdateVisitedHistory(view, url, isReload);
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
}
@Override
public void onPageFinished(WebView view, String url) {
//适应高度 1
webActivity.loadUrl("javascript:App.resize(document.body.getBoundingClientRect().height)");
super.onPageFinished(view, url);
}
});
//适应高度 2
webActivity.addJavascriptInterface(this, "App");
webActivity.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
AlertDialog dialog = new AlertDialog.Builder(WebViewActivity.this)
.setMessage(message)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
}).create();
dialog.show();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
AlertDialog dialog = new AlertDialog.Builder(WebViewActivity.this)
.setMessage(message)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
}).create();
dialog.show();
return true;
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) {
EditText editText = new EditText(WebViewActivity.this);
editText.setText(defaultValue);
editText.setSelectAllOnFocus(true);
AlertDialog dialog = new AlertDialog.Builder(WebViewActivity.this)
.setMessage(message)
.setView(editText)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.cancel();
}
}).create();
dialog.show();
return true;
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
ivGif.setVisibility(View.GONE);
includeView.setVisibility(View.VISIBLE);
}
}
});
}
//适应高度 3
@JavascriptInterface
public void resize(final float height) {
WebViewActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
webActivity.setLayoutParams(new LinearLayout.LayoutParams(getResources().getDisplayMetrics().widthPixels, (int) (height * getResources().getDisplayMetrics().density)));
}
});
}
这样就正常显示了,弄了好几天的bug......