SwipeRefreshLayout與WebView內部子可滾動div衝突
問題參見下圖(圖片來自於網路:))
下圖是我的頁面,分為3個div,三個div的高度加起來是100%佔據整個webview頁面。而最下面的第三個div是一個可滾動的div(overflow: "auto")。往上滑動時沒問題的,但是往下滑動就會出現上面gif中的問題。
網上有如下解決方案,但是針對這個案例是無效的,因為本案例中webView.getScrollY始終為0(三個div構成了整個webview頁面,自始至終這三個div位置是不會變化的,是固定的)
// 設定子檢視是否允許滾動到頂部
refreshLayout.setOnChildScrollUpCallback(new SwipeRefreshLayout.OnChildScrollUpCallback() {
@Override
public boolean canChildScrollUp(SwipeRefreshLayout parent, @Nullable View child) {
return webView.getScrollY() > 0;
}
});
所以問題在於如何監聽webview頁面內子佈局的滾動,以子佈局的滾動來控制重新整理動作。
可以利用webview的evaluateJavascript方法來監聽特定元素,第一個引數script用於執行一段js指令碼以獲取指定元素的指定屬性比如div的height,第二個引數resultCallback是一個回撥函式,當取到第一個引數指定的屬性時就會執行呼叫。
public void evaluateJavascript(String script, ValueCallback<String> resultCallback)
所以解決方案很明瞭了。只需要利用evaluateJavascript來監聽可滾動的div的scrollTop值,當其為0時表示在頂端,此時下拉可以重新整理。否則禁止下拉重新整理。注意,這裡需要和前端商量約定統一的要監聽的元素的id,即下面的inner_scroll_box。
webView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_MOVE:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webView.evaluateJavascript("document.getElementById(\"inner_scroll_box\").scrollTop", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
if (!TextUtils.isEmpty(value) && !"null".equals(value)) {
if (Integer.parseInt(value) == 0) {
refreshLayout.setEnabled(true);
} else {
refreshLayout.setEnabled(false);
}
}
}
});
}
break;
}
}
對於沒有id的React元件,比如antd mobile元件Picker,就需要新增一個隱藏的div,然後根據Picker的狀態的改變來改變div的height,最後就可以在android端根據div的高度來決定是否可以下拉重新整理了。
新增id為type_picker的隱藏div,在onVisibleChange中根據Picker列表的隱藏狀態來改變div的高度。
<div>
<Picker data={vms} cols={1} title={"資金型別"} value={this.state.value} extra={v2label[this.state.value]}
onChange={v => {if (v === this.state.value) {this.handleChange(v2type[v]);this.setState({ value: v })}}}
onVisibleChange={v => {if (v===true) {document.getElementById('type_picker').style.height="1px"} else {document.getElementById('type_picker').style.height="0px"}}}
>
<CustomPickerButton/>
</Picker>
{/*新增此div是為了與android端進行特殊操作,讓android端知道Picker隱藏狀態*/}
<div id={"type_picker"} style={{visibility: "none", height: 0}}></div>
</div>
在android端根據id為type_picker的div的高度來決定是否可以下拉重新整理。
webView.evaluateJavascript("document.getElementById(\"type_picker\").style.height", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
if (!TextUtils.isEmpty(value) && !"null".equals(value)) {
if (!"0px".equals(value.replace("\"", ""))) {
refreshLayout.setEnabled(false);
} else {
refreshLayout.setEnabled(true);
}
}
}
});
相關文章
- div有滾動條 返回頂部
- Android Webview和ScrollView衝突和WebView使用總結AndroidWebView
- div滾動條樣式,水平滾動
- Axure解決列表項中"觸發內部元件互動"的衝突問題元件
- 埠衝突,可愛的8080
- 移動端div跟隨滾動條滾動(自制
- 監聽div滾動高度
- 一個div滾動到底部
- 融合與衝突:當電子遊戲遇到大眾傳媒遊戲
- VMware無法啟動/VMware和wsl衝突問題/VMware與Hyper-V衝突問題
- javamelody與swagger註解衝突JavaSwagger
- PtrClassicFrameLayout與viewpager橫向滑動衝突的問題Viewpager
- RecyclerView 、ViewPager 左右滑動衝突Viewpager
- Scrollview 和 內部 recycleview 高度固定時巢狀衝突的一種解決方法View巢狀
- underscore 系列之防衝突與 Utility FunctionsFunction
- statistics_level與SGA_TARGET衝突
- 誤解與鄙視鏈:談COD系列在中國的內外衝突
- 雜湊衝突
- web簡單頁面佈局fixed 頭部固定 內容滾動Web
- 短視訊app開發,內部標題進行滾動播放APP
- div顯示滾動條(類似合同閱讀)
- openGauss備庫wal-replay與query衝突
- [20190515]熱備份模式與rman衝突.txt模式
- Github Fork倉庫的衝突與同步管理Github
- MySql插入唯一鍵衝突的三種可選方式MySql
- Flutter可滾動Widgets-ListViewFlutterView
- 解決動態庫的符號衝突符號
- 內部類與靜態內部類
- 360安全衛士與win10衝突怎麼辦_360安全衛士與win10衝突如何處理Win10
- lvm 名稱衝突LVM
- git 解決衝突Git
- Git 解決衝突Git
- Android webview 與 js(Vue) 互動AndroidWebViewJSVue
- Android與WebView資料互動AndroidWebView
- Flutter使用JsBridge與WebView互動FlutterJSWebView
- 易優cms目錄名稱與系統內建衝突,去掉限制方法詳解!
- 在擁有捲軸元素內滾動時,判斷其子元素是否出現(達到可視區域)公式公式
- Flutter 新聞詳情頁二——WebView和列表豎直滾動FlutterWebView