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有滾動條 返回頂部
- 蘋果內部衝突 Siri團隊人才基本走光蘋果
- Android Webview和ScrollView衝突和WebView使用總結AndroidWebView
- 重寫ListView解決ListView內部ViewPaper滑動事件衝突問題View事件
- Axure解決列表項中"觸發內部元件互動"的衝突問題元件
- div滾動條樣式,水平滾動
- ScrollView 與ListView 滑動衝突解決View
- 融合與衝突:當電子遊戲遇到大眾傳媒遊戲
- 埠衝突,可愛的8080
- 移動端div跟隨滾動條滾動(自制
- 監聽div滾動高度
- 設定div滾動條
- VMware無法啟動/VMware和wsl衝突問題/VMware與Hyper-V衝突問題
- RecyclerView 、ViewPager 左右滑動衝突Viewpager
- 一個div滾動到底部
- PtrClassicFrameLayout與viewpager橫向滑動衝突的問題Viewpager
- svn檔案衝突,樹衝突詳解
- BE Remote Agent與Oracle EM埠衝突REMOracle
- Scrollview 和 內部 recycleview 高度固定時巢狀衝突的一種解決方法View巢狀
- underscore 系列之防衝突與 Utility FunctionsFunction
- statistics_level與SGA_TARGET衝突
- javamelody與swagger註解衝突JavaSwagger
- UITapGestureRecognizer與didSelectRowAtIndexPath衝突解決UIIndex
- google EventBus與spring注入的衝突GoSpring
- commit 衝突MIT
- 雜湊衝突
- web簡單頁面佈局fixed 頭部固定 內容滾動Web
- 短視訊app開發,內部標題進行滾動播放APP
- 使用SUI與JQuery衝突的解決方法UIjQuery
- perl-Time-HiRes安裝與perl衝突
- Github Fork倉庫的衝突與同步管理Github
- MySql插入唯一鍵衝突的三種可選方式MySql
- 解決動態庫的符號衝突符號
- 像 QQ 一樣處理滑動衝突
- .NET GridView使用滾動條(通過<div>)View
- RecyclerView與下拉重新整理控制元件滑動衝突的解決View控制元件
- webview與JS的互動WebViewJS
- 如何判斷滾動是否滾動到了網頁底部或者頂部網頁