ScrollView巢狀WebView WebView自動滾動的問題
阿新 • • 發佈:2018-12-15
最近專案中有用到WebView,然後底部又用需要展示原生的內容。於是就想到了用ScrollView巢狀WebView,
原來想的是WebView的高度固定,通過滑動WebView到臨界值去交換滑動事件,但發現會有一些小問題。Ps: WebView未載入完全時能看到WebView底部的原生內容,而且滑動到WebView頂部獲底部交換滑動事件時會有卡頓,沒有聯動的效果,影響使用者體驗。
於是乎只能換另一種方式:通過動態的獲取WebView的內容設定WebView的高度:
javascript:MyApp.resize(document.body.getBoundingClientRect().height); @JavascriptInterface public void resize(final float height) { mWebView.post(new Runnable() { @Override public void run() { if (mWebView != null) { ViewGroup.LayoutParams params = mWebView.getLayoutParams(); params.width = getResources().getDisplayMetrics().widthPixels; params.height = (int) (height * getResources().getDisplayMetrics().density); mWebView.setLayoutParams(params); } } }); }
當然還需要監聽onDraw方法去監聽WebView的內容變化去改變WebView的高度:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (getContentHeight() != lastContentHeight) { lastContentHeight = getContentHeight(); if (mOnContentChangeListener != null) { mOnContentChangeListener.onContentChange(); } } }
mWebView.setOnContentChangeListener(new CustomWebView.OnContentChangeListener() { @Override public void onContentChange() { if (mWebView != null) { mWebView.loadUrl("javascript:MyApp.resize(document.body.getBoundingClientRect().height)"); } } });
滑動事件交給ScrollView控制。但此時遇到一個問題困擾了我好久:有時候載入WebView的時候WebView會自動滾動到某一區域而不是頂部。
原來的思路是監聽WebView的載入進度然後到100%的時候設定滾動到頂部,發現還是有瑕疵,因為自動滾動是發生在載入完成之後。後來靈機一動,想到ViewPager+Fragment+RecyclerView的時候有時候RecyclerView會自動滾動,想到可能是WebView搶佔了焦點而導致的自動滾動,於是就在WebView的父佈局加了一行:
android:descendantFocusability="blocksDescendants"
發現解決了!神奇,哈哈!~
至於descendantFocusability的作用可以看我上一篇博文:https://blog.csdn.net/ZuoZuoShengHen/article/details/85009176