Scrollview嵌套webveiw,RelativeLayout和listview的时候,解决底部留有大片空白,显示不全的问题

开发的时候遇到一个难题,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......

猜你喜欢

转载自blog.csdn.net/qq_41873558/article/details/81288530
今日推荐